请考虑以下代码:
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
延伸?可能存在哪种情况不安全?
答案 0 :(得分:1)
getByClassName
的调用者指定T
为SomeObject
的任何子类,但它不必是与className
相同的子类。一个由<T extends SomeObject>
命名的。可以认为T
表示类型变量foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")
是传递给方法调用的另一个参数。
例如,不安全的用法是List<SomeObjectSubclass1>
- 该语法是如何明确指定类型参数,而不是让它们被推断 - 然后返回{{1}实际上包含SomeObjectSubclass2
,一切都将是灾难。
您可以安全地做的是让clazz
成为Class<? extends SomeObject>
,然后返回List<? extends SomeObject
。