如何解决这个未经检查的分配警告?

How to fix this unchecked assignment warning?

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

我在 blockRta.registerSubtype(c); 行收到 Warning:(31, 46) Unchecked assignment: 'java.lang.Class' to 'java.lang.Class<? extends PACKAGE_NAME.Block>' 警告,但我不知道如何在不抑制它的情况下解决它。

ReflectionHelper.getClasses是静态方法获取那个包名中的所有classes,它的return类型是Class[]Block 是一个接口。 RuntimeTypeAdapterFactory是gson extra中的一个class,其源码可以查看here.

因为 ReflectionHelper.getClasses returns 原始类型的数组 Class,局部变量类型推断将使用此原始类型 Class[] for var blks反过来,var c 的原始类型 Class。将原始类型 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));
    }
}