繁体   English   中英

为什么是varargs(Class <? extends Throwable> ... t)“未经检查或不安全”的操作?

[英]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确实扩展了RuntimeExceptionExceptionThrowable

我应该如何正确修改我的代码以摆脱这个警告?

我真的不想实例化我的异常......使用.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM