vik*_*eve 12 java generics exception variadic-functions compiler-warnings
好的,我正在调用一个带签名的方法,(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);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器是否应该能够看到IllegalArgumentException确实扩展了RuntimeException,Exception并且Throwable?
我应该如何正确修改我的代码以摆脱这个警告?
我真的不想实例化我的例外......使用它似乎更好 .class
(不要用@SuppressWarnings任何一个!)
我正在使用java 7.感谢任何提示.
Mar*_*ers 13
因为varargs实际上只是数组,并且泛型和数组不会混合(好),所以当您使用泛型vararg类型调用方法时,Java传统上会发出警告.这是因为从技术上讲,数组是在调用者处创建的.
但是,很明显,从调用者的角度来看,仅仅传递给varargs方法的数组并没有像普通通用数组那样遭受同样的危险,但是接收通用数组的方法本身可能会滥用它们.因此,在Java 7转发中,警告出现在方法本身(在您的情况下onException),并且可以通过使用@SafeVarargs方法上的注释来抑制:
@SafeVarargs
public void onException(Class<? extends Throwable>... exceptions) { }
Run Code Online (Sandbox Code Playgroud)
如果您实际上没有使用Java 7语言,或者您无法更改onException(可能是因为它是库方法),那么您可以安全地使用@SuppressWarnings隐藏该警告:
@SuppressWarnings("unchecked")
public static void main(String[] args) {
new VarargsFun().onException(IllegalArgumentException.class);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果以这种方式抑制警告,请注意以自己的方法隔离这一个语句,以免意外抑制其他未来的警告.
就个人而言,我在IDE中完全禁用了通用的vararg警告,因为从调用者的角度来看,它们几乎从不指示错误的代码.
new*_*cct 11
如果你意识到这一点,最容易理解
new VarargsFun().onException(IllegalArgumentException.class);
Run Code Online (Sandbox Code Playgroud)
只是语法糖
new VarargsFun().onException(
new Class<? extends Throwable>[]{ IllegalArgumentException.class });
Run Code Online (Sandbox Code Playgroud)
即调用站点创建一个阵列,其组件类型等于varargs的类型.
但当然,new Class<? extends Throwable>[]Java中不允许这样做.所以编译器会new Class<?>[]改为并发出警告.
| 归档时间: |
|
| 查看次数: |
5185 次 |
| 最近记录: |