[英]Determine the type of a generic class at Runtime
我知道以下事实:该网站充满类似的问题,并且通过快速阅读给定的问题,想到的第一个答案是“不,你不能”,但我仍然给我印象是绝不是不可能的。
我在一个类中创建了一个通用方法,我想检查传递给该方法的Object的类型。 我知道它不能直接完成,因此我将对象Class<T>
obj传递给该方法。 但是我找不到方法主体中正确执行类型检查的方法。
public <T> void readData(T obj1, Class<T> obj2){
}
假定T
始终是以下三种类型之一: ClassA
, ClassB
或ClassC
。 if-else-if块应如何显示?
使用obj2.cast(obj1)
,它将obj1
转换为obj2
表示的类或接口,如果obj1
可分配给类型T
(请注意null
可以分配给任何类型),则返回obj1
,否则抛出ClassCastException
。
我们对obj2.cast(obj1)==obj1
的结果不感兴趣,因为静态已知的obj1
类型已经是T
并且obj2.cast(obj1)==obj1
(如果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
//...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.