Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型方法参数强制转换安全性的getClass()_Java_Generics - Fatal编程技术网

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