如何解决此未经检查的作业警告?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决此未经检查的作业警告?相关的知识,希望对你有一定的参考价值。

var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for (var c : blks) {
    if (Block.class.isAssignableFrom(c)) {
        blockRta.registerSubtype(c);
    }
}

我在Warning:(31, 46) Unchecked assignment: 'java.lang.Class' to 'java.lang.Class<? extends PACKAGE_NAME.Block>'行上收到了blockRta.registerSubtype(c);警告,但我想不出办法解决这个问题,而没有抑制它。

ReflectionHelper.getClasses是获取该包名称中所有类的静态方法,其返回类型为Class[]Block是一个接口。 RuntimeTypeAdapterFactory是gson extra中的一类,可以查看其源代码here

答案

由于ReflectionHelper.getClasses返回原始类型Class的数组,所以局部变量类型推断将对Class[]使用此原始类型var blks,对Class使用原始类型var c。对Class使用原始类型c可以将其传递给registerSubtype(Class<? extends Block>),而无需任何检查,但也不能没有任何警告。您可以使用方法asSubclass执行checked转换,但是必须声明一个显式的非原始变量类型,以摆脱原始类型,否则,甚至是asSubclass的结果调用将被编译器擦除为原始类型。

有两种方法。更改blks的类型:

Class<?>[] blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for(var c: blks) {
    if (Block.class.isAssignableFrom(c)) {
        blockRta.registerSubtype(c.asSubclass(Block.class));
    }
}

然后,var c的类型自动更改为Class<?>

或仅更改c的类型:

var blks = ReflectionHelper.getClasses("PACKAGE_NAME");
var blockRta = RuntimeTypeAdapterFactory.of(Block.class);
for(Class<?> c: blks) {
    if (Block.class.isAssignableFrom(c)) {
        blockRta.registerSubtype(c.asSubclass(Block.class));
    }
}

以上是关于如何解决此未经检查的作业警告?的主要内容,如果未能解决你的问题,请参考以下文章

未经检查的演员表警告 - 如何避免这种情况? [复制]

如何满足 Java 编译器设置 SimpleObjectProperty 的未经检查的警告

Kotlin泛型未经检查的警告

重新设计未经检查的演员警告

如何解决此错误“警告:尝试呈现其视图不在窗口层次结构中”?

Java 1.7 varargs 函数报告为未经检查的警告