gpt4 book ai didi

java - 为什么 varargs (Class... t) "unchecked or unsafe"操作?

转载 作者:搜寻专家 更新时间:2023-10-30 21:02:03 25 4
gpt4 key购买 nike

好的,我正在调用一个带有签名的方法 (Class<? extends Throwable>... exceptions)我在主要方法中收到“File.java 使用未经检查或不安全的操作”警告:

public class VarargsFun {
public void onException(Class<? extends Throwable>... exceptions) { }

public static void main(String[] args) {
new VarargsFun().onException(IllegalArgumentException.class);
}
}

编译器不应该能够看到 IllegalArgumentException吗?确实扩展了 RuntimeException , ExceptionThrowable

我应该如何正确修改我的代码以消除此警告?

我真的不想实例化我的异常...使用 .class 似乎更好

(也不想使用 @SuppressWarnings!)

我正在使用 java 7。感谢您提供任何提示。

最佳答案

因为可变参数实际上只是数组,而generics and arrays don't mix (好吧),传统上,当您调用具有通用可变参数类型的方法时,Java 会发出警告。这是因为数组在技术上是在调用者处创建的。

但是,很快就很明显,从调用者的角度来看,仅为传递给可变参数方法而创建的数组并没有遭受与普通泛型数组相同的危险,但是接收通用数组可能会滥用它们。所以在 Java 7 中,警告出现在方法本身上(在你的例子中,onException)并且可以通过使用 @SafeVarargs 来抑制方法注释:

@SafeVarargs
public void onException(Class<? extends Throwable>... exceptions) { }

如果您实际上没有使用 Java 7 语言,或者如果您无法更改 onException(大概是因为它是一个库方法),那么您可以安全地使用 @SuppressWarnings 隐藏该警告:

@SuppressWarnings("unchecked")
public static void main(String[] args) {
new VarargsFun().onException(IllegalArgumentException.class);
}

但是,如果您以这种方式抑制警告,请注意将此语句隔离在其自己的方法中,以免意外抑制其他 future 的警告。

就个人而言,我在我的 IDE 中完全禁用了通用可变参数警告,因为从调用者的角度来看,它们几乎从不指示错误代码。

关于java - 为什么 varargs (Class<? extends Throwable>... t) "unchecked or unsafe"操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15114649/

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