这是一个尝试改进我的代码问题。关于泛型和未经检查的警告;我确实知道 @suppresswarnings
注释。问题是我应该编写什么代码来抑制它。请使用以下代码。
public class NumericBox<T extends Number> implements Box<T> {
private T element;
public NumericBox(T element) {
this.element = element;
}
@Override public T getElement() {
return element;
}
public T insert(Number newElement) {
T oldElement = this.element;
this.element = (T) newElement; // warning("unchecked")
return oldElement;
}
}
执行此操作的编码方式是什么(不是注释)。在我找到的文档中 术语“未经检查”意味着编译器没有足够的类型信息来执行确保类型安全所需的所有类型检查。但是,请不要理解它。这对我来说似乎没问题:
void foo(Number n) {
Short asShort = (Short) n; //OK
T asTypeWhichExtendsNumber = (T) n; // warning
}
额外。如果我想添加一个空的构造函数,有什么方法可以在元素中保留“零”吗?
NumeircBox<Short> o = new NumericBox<>(); // expectes 0 in the element
最佳答案
让我们看看有问题的代码,您的 class
声明:
public class NumericBox<T extends Number> implements Box<T>
所以我们有一些T
类型扩展了Number
。这可能是Long
、Integer
等。但是一些特定和在编译时定义类型。
现在你有了一个方法:
public T insert(Number newElement) {
T oldElement = this.element;
this.element = (T) newElement;
return oldElement;
}
它需要任何类型的Number
- 既不是特定也不是在编译时定义,并且您将其强制转换为T
。 这是一个等待发生的ClassCastException
。
final NumericBox<BigDecimal> box = new NumericBox<>();
box.insert(3);
final BigDecimal val = box.getElement(); <-- OOPS!
没有办法避免这个警告,因为编译器告诉你这个例子,你有一个未经检查的强制转换,可能在运行时导致ClassCastException
。编译器正在放弃该行。
因此,要解决您的问题,请将代码更改为:
public T insert(T newElement) {
T oldElement = this.element;
this.element = (T) newElement;
return oldElement;
}
由于泛型在编译时被删除,因此实际上没有任何方法来修复该黑客行为。如果你想保证运行时类型安全,你需要更改签名。如果您想获取“任何旧的号码
”,那么您将不得不承担后果。
关于java - 解决Java中的 "unchecked warning",避免@suppressWarnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720243/