我知道该网站充满了类似的问题,通过快速阅读给定问题,我想到的第一个答案是“不,你不能”,但我仍然有这样的印象:无论如何,我所要求的并非不可能。
我在类中创建了一个泛型方法,我想检查传递给该方法的Object的类型。我知道它不能直接完成,因此我将一个对象Class<T>
obj传递给该方法。但是我找不到在方法体中正确执行类型检查的方法。
public <T> void readData(T obj1, Class<T> obj2){
}
假设T
始终属于以下三种类型之一:ClassA
,ClassB
或ClassC
。 if-else-if块应该如何?
答案 0 :(得分:0)
使用obj2.cast(obj1)
将obj1
强制转换为obj2
所代表的类或接口,如果obj1
可分配给obj1
,则返回T
(请注意,null
可分配给任何类型),否则会抛出ClassCastException
。
我们对演员的结果不感兴趣,因为静态已知的obj1
类型已经是T
和obj2.cast(obj1)==obj1
(如果演员成功的话) )。但是,如果强制转换失败,则会抛出一个早期异常。
示例:
public <T> void readData(T obj1, Class<T> obj2){
obj2.cast(obj1);
//...
}
以下调用(从Class<?>
到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
//...
}