2013-02-28 71 views
0

我知道这个网站充满了类似的问题,通过快速阅读给定的问题,想到的第一个答案是“不,你不能“,但我仍然有这样的印象:我所要求的并不是不可能的。在运行时确定一个通用类的类型

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

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

假设T总是以下三种类型:ClassAClassBClassC。 if-else-if块应该如何?

+2

我猜w如果(obj1 instanceof ClassA){...} if(obj1 instanceof ClassB){...} .... – 2013-02-28 14:20:50

+0

您可以随时执行obj1.getClass()。getSimpleName()。equals()为obj2),从而知道他们的名字是否相等,否则我不明白为什么发送*两个*参数。 – Infested 2013-02-28 14:25:38

+0

@LuiggiMendoza是对的。在这种情况下,你甚至不需要obj2。 – Pace 2013-02-28 14:26:01

回答

0

使用obj2.cast(obj1),其投射obj1obj2表示的类或接口,返回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 
//... 
}