[英]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
扩展呢? 在不安全的情况下可能会出现什么情况?
的调用者 getByClassName
指定T
是的任何子类SomeObject
,但这并不必须是同一小类由指定的一个className
。 将<T extends SomeObject>
视为表明类型变量T
是传递给方法调用的另一个参数。
因此,例如,不安全的用法将是foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")
-该语法是您显式指定类型参数的方式,而不是让它们被推断-然后返回List<SomeObjectSubclass1>
实际上包含SomeObjectSubclass2
,一切都将是一场灾难。
您可以安全地做的就是让clazz
成为Class<? extends SomeObject>
Class<? extends SomeObject>
,然后返回List<? extends SomeObject
List<? extends SomeObject
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.