为什么 Eclipse 会抱怨不安全的类型转换?

Why does Eclipse complain about unsafe type casting?

考虑以下代码:

public static <T extends SomeObject> List<T> getByClassName(String className) throws GetRecordsException {
    try {
        Class<T> clazz = (Class<T>) Class.forName(className).asSubclass(SomeObject.class);
        return getByClassName(clazz);
    } catch (ClassNotFoundException e) {
        throw new GetRecordsException("Failed to get class forName: " + className, e);
    }
}

Eclipse 使用以下消息突​​出显示演员表 (Class<T>)

Type safety: Unchecked cast from Class<capture#2-of ? extends SomeObject> to Class<T>

为什么会这样,考虑到 T 应该保证从方法签名中的 SomeObject 扩展?可能存在什么不安全的情况?

getByClassNamecaller 指定 TSomeObject 的任何子类,但不必相同className 命名的子类。将 <T extends SomeObject> 视为指示类型变量 T 是传递给方法调用的另一个参数。

因此,例如,不安全的用法是 foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")——该语法是您明确指定类型参数的方式,而不是让它们被推断——然后就是 return List<SomeObjectSubclass1> 实际包含 SomeObjectSubclass2,一切都将是一场灾难。

你可以安全地做的是让 clazz 成为 Class<? extends SomeObject>,然后 return 成为 List<? extends SomeObject.