gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:58:22 24 4
gpt4 key购买 nike

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

现在你有了一个方法:

public T insert(Number newElement) {
T oldElement = this.element;
this.element = (T) newElement;
return oldElement;
}

它需要一些任何类型的 Number - 既不是specfic 也不是在编译时定义 并且你将它强制转换为 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;
}

由于泛型在编译时被删除,所以没有真正任何的方法来修复这个问题。如果要保证运行时类型安全,则需要更改签名。如果您想使用“任何旧的 Number”,那么您将不得不承担后果。

关于java - 在 Java 中解决 "unchecked warning"避免@suppressWarnings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27720243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com