![](/img/trans.png)
[英]Unsafe operations… Recompile with -Xlint:unchecked… I can't seem to understand why the operation is unsafe
[英]Why is varargs (Class<? extends Throwable>… t) “unchecked or unsafe” operation?
好的,我正在调用一个带签名的方法(Class<? extends Throwable>... exceptions)
并在main方法中得到一个“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
, Exception
和Throwable
?
我应该如何正确修改我的代码以摆脱这个警告?
我真的不想实例化我的异常......使用.class
似乎更好
(也不想使用@SuppressWarnings
!)
我正在使用java 7.感谢任何提示。
因为varargs实际上只是数组,并且泛型和数组不会混合 (好),所以当您使用泛型vararg类型调用方法时,Java传统上会发出警告。 这是因为从技术上讲,数组是在调用者处创建的。
但是,很明显,从调用者的角度来看,仅仅传递给varargs方法的数组并没有像普通通用数组那样遭受同样的危险,但是接收通用数组的方法本身可能会滥用它们。 因此,在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);
}
但是,如果以这种方式抑制警告,请注意以自己的方法隔离这一个语句,以免意外抑制其他未来的警告。
就个人而言,我在IDE中完全禁用了通用的vararg警告,因为从调用者的角度来看,他们几乎从不指示错误的代码。
如果你意识到这一点,最容易理解
new VarargsFun().onException(IllegalArgumentException.class);
只是语法糖
new VarargsFun().onException(
new Class<? extends Throwable>[]{ IllegalArgumentException.class });
即调用站点创建一个阵列,其组件类型等于varargs的类型。
但当然, new Class<? extends Throwable>[]
在Java中不允许使用new Class<? extends Throwable>[]
。 因此编译器会执行new Class<?>[]
并发出警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.