java - 解决Java中的 "unchecked warning",避免@suppressWarnings

标签 java generics unchecked

这是一个尝试改进我的代码问题。关于泛型和未经检查的警告;我确实知道 @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。这可能是LongInteger等。但是一些特定在编译时定义类型。

现在你有了一个方法:

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/

相关文章:

java - 在 JButton 的右上角画一些东西

java - 与 Java 泛型和子类化的混淆

c# - 尝试学习如何编写使用泛型类型的方法

java - 未经检查的 Actor : Is there a way to avoid it in this case?

java - 未经检查的分配警告

java - 如何停止在 Play Framework 中多次运行单例类

java - 如何绘制如下图所示的形状

java - Java中使用split()方法以空格作为分隔符分割字符串

java - 在Java中模拟函数模板

Java 未经检查的操作转换为泛型