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

时间:2015-01-26 19:39:32

标签: java eclipse reflection type-safety

请考虑以下代码:

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延伸?可能存在哪种情况不安全?

1 个答案:

答案 0 :(得分:1)

getByClassName调用者指定TSomeObject的任何子类,但它不必是与className相同的子类。一个由<T extends SomeObject>命名的。可以认为T表示类型变量foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")是传递给方法调用的另一个参数。

例如,不安全的用法是List<SomeObjectSubclass1> - 该语法是如何明确指定类型参数,而不是让它们被推断 - 然后返回{{1}实际上包含SomeObjectSubclass2,一切都将是灾难。

您可以安全地做的是让clazz成为Class<? extends SomeObject>,然后返回List<? extends SomeObject