为什么 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
扩展?可能存在什么不安全的情况?
getByClassName
的 caller 指定 T
为 SomeObject
的任何子类,但不必相同className
命名的子类。将 <T extends SomeObject>
视为指示类型变量 T
是传递给方法调用的另一个参数。
因此,例如,不安全的用法是 foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")
——该语法是您明确指定类型参数的方式,而不是让它们被推断——然后就是 return List<SomeObjectSubclass1>
实际包含 SomeObjectSubclass2
,一切都将是一场灾难。
你可以安全地做的是让 clazz
成为 Class<? extends SomeObject>
,然后 return 成为 List<? extends SomeObject
.
考虑以下代码:
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
的 caller 指定 T
为 SomeObject
的任何子类,但不必相同className
命名的子类。将 <T extends SomeObject>
视为指示类型变量 T
是传递给方法调用的另一个参数。
因此,例如,不安全的用法是 foo.<SomeObjectSubclass1>getByClassName("SomeObjectSubclass2")
——该语法是您明确指定类型参数的方式,而不是让它们被推断——然后就是 return List<SomeObjectSubclass1>
实际包含 SomeObjectSubclass2
,一切都将是一场灾难。
你可以安全地做的是让 clazz
成为 Class<? extends SomeObject>
,然后 return 成为 List<? extends SomeObject
.