java为什么Eclipse抱怨不安全的类型转换?
考虑下面的代码:
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正在用以下消息突出显示cast(Class<T>)
:
Type safety: Unchecked cast from Class<capture#2-of ? extends SomeObject> to Class<T>
考虑到T
应该保证从方法签名中的SomeObject
扩展,这是为什么呢?可能存在哪些不安全的情况
# 1 楼答案
getByClassName
的调用方指定T
为SomeObject
的任何子类,但该子类不必与className
命名的子类相同。将<T extends SomeObject>
视为指示类型变量T
是传递给方法调用的另一个参数例如,一个不安全的用法是
foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")
,语法是显式指定类型参数的方式,而不是让它们被推断,然后返回一个实际包含SomeObjectSubclass2
的List<SomeObjectSubclass1>
,一切都将是一场灾难您可以安全地将
clazz
设为Class<? extends SomeObject>
,然后返回List<? extends SomeObject