Java 泛型方法参数强制转换安全性的getClass()
这个石膏安全吗Java 泛型方法参数强制转换安全性的getClass(),java,generics,Java,Generics,这个石膏安全吗 private <T> void foo(T value) { final Class<T> aClass = (Class<T>) value.getClass(); } private void foo(T值){ 最终类aClass=(类)value.getClass(); } 是否存在一种更优雅的方式来实现这一点 是否可以避免未经检查的强制转换警告?您可以取消显示编译器警告。看 编译器警告您是有原因的value可以包含T的
private <T> void foo(T value) {
final Class<T> aClass = (Class<T>) value.getClass();
}
private void foo(T值){
最终类aClass=(类)value.getClass();
}
是否存在一种更优雅的方式来实现这一点
是否可以避免未经检查的强制转换警告?您可以取消显示编译器警告。看 编译器警告您是有原因的
value
可以包含T
的某些子类型的对象,并且Class
和Class
之间存在重要区别。在您的例子中,您可以看到您没有做任何不安全的事情,但是编译器只是遵循规则
想象一下,如果方法略有不同,并且有一种方法可以获得另一个类型为T
的值:
<T> void foo(T a, T b) {
final Class<T> aClass = (Class<T>) a.getClass();
// What can go wrong? casting T to T
T c = aClass.cast(b);
}
// but what if the two parameters are of different classes at runtime
foo(5, 5.5); // ClassCastException!
void foo(T a,T b){
最终类aClass=(类)a.getClass();
//会出什么问题?从T到T的转换
tc=aClass.cast(b);
}
//但是如果这两个参数在运行时属于不同的类呢
foo(5,5.5);//ClassCastException!
或者,如果我们允许Class
作为返回值转义,该怎么办
<T> Class<T> foo(T val) {
final Class<T> aClass = (Class<T>) val.getClass();
return aClass;
}
// uhoh is declared as Class<Number> but contains Class<Integer> at runtime
Class<Number> uhoh = foo(5);
// Ok to cast Double to Number but not to Integer
Number num = uhoh.cast(5.5); // ClassCastException!
foo类(T val){
最终类aClass=(类)val.getClass();
返回aClass;
}
//uhoh声明为类,但在运行时包含类
uhoh类=foo(5);
//可以将Double强制转换为数字,但不能转换为整数
数字num=uhoh.cast(5.5);//ClassCastException!
它是安全的。在铸造值之前进行检查=空
它实际上并不安全。返回的Class
对象不是T
类型,而是T
的擦除(或者可能是子类型)。如果T
是泛型的,那么返回的Class
对象将不会反映泛型参数。这是一个轻微的堆污染案例。在大多数情况下,它是良性的,但最正确的方法可能是使用类型
对象,而不是类
对象。这个答案是正确的,但它忽略了泛型类型在混合中带来的其他问题foo(new ArrayList())
将返回编译时类型为Class
的值,即使该类型在运行时是不可能的:对于相应的原始类型,运行时的实际类对象将是Class
。