繁体   English   中英

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

[英]Determine the type of a generic class at Runtime

我知道以下事实:该网站充满类似的问题,并且通过快速阅读给定的问题,想到的第一个答案是“不,你不能”,但我仍然给我印象是绝不是不可能的。

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

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

假定T始终是以下三种类型之一: ClassAClassBClassC 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM