0

我知道该网站充满了类似的问题,并且通过快速阅读给定的问题,我想到的第一个答案是“不,你不能”,但我仍然觉得我是什么无论如何,询问并非不可能。

我在一个类中创建了一个泛型方法,我想检查传递给该方法的 Object 的类型。我知道它不能直接完成,因此我将一个对象Class<T>obj 传递给该方法。但是我找不到在方法体中正确执行类型检查的方法。

public <T> void readData(T obj1, Class<T> obj2){
}   

假设它T始终是以下三种类型之一ClassAClassBClassC。if-else-if 块应该是什么样子?

4

1 回答 1

0

Use obj2.cast(obj1),它强制转换obj1为由 表示的类或接口obj2obj1如果obj1可分配给该类型T(请注意,null可分配给任何类型),则返回,否则抛出ClassCastException

我们对转换的结果不感兴趣,因为静态已知的类型obj1已经是Tand obj2.cast(obj1)==obj1(如果转换成功)。但是,如果强制转换失败,则会抛出早期异常。

例子:

public <T> void readData(T obj1, Class<T> obj2){
 obj2.cast(obj1); 
 //... 
}   

以下调用(从Class<?>to有未经检查的强制转换Class<String>)将失败:

readData("Hello",(Class<String>)(Class<?>)Integer.class);

该方法cast对于替换未经检查的强制转换也很有用,例如:

public <T> void readData(Object obj1, Class<T> obj2){
 T t = (T)obj1;//BAD: unchecked cast
 //...
}


public <T> void readData(Object obj1, Class<T> obj2){
 T t = obj2.cast(obj1());//GOOD: ClassCastException if the cast fails
 //...
}
于 2013-03-17T10:46:12.567 回答