在运行时确定泛型类的类型

时间:2013-02-28 14:19:25

标签: java generics if-statement

我知道该网站充满了类似的问题,通过快速阅读给定问题,我想到的第一个答案是“不,你不能”,但我仍然有这样的印象:无论如何,我所要求的并非不可能。

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

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

假设T始终属于以下三种类型之一:ClassAClassBClassC。 if-else-if块应该如何?

1 个答案:

答案 0 :(得分:0)

使用obj2.cast(obj1)obj1强制转换为obj2所代表的类或接口,如果obj1可分配给obj1,则返回T (请注意,null可分配给任何类型),否则会抛出ClassCastException

我们对演员的结果不感兴趣,因为静态已知的obj1类型已经是Tobj2.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
 //...
}