Java 在运行时确定泛型类的类型
我知道这个网站充满了类似的问题,通过快速阅读给定的问题,我脑海中的第一个答案是“不,你不能”,但我仍然有这样的印象,我所问的并不是不可能的 我在一个类中创建了一个泛型方法,我想检查传递给该方法的对象的类型。我知道它不能直接完成,因此我将对象Java 在运行时确定泛型类的类型,java,generics,if-statement,Java,Generics,If Statement,我知道这个网站充满了类似的问题,通过快速阅读给定的问题,我脑海中的第一个答案是“不,你不能”,但我仍然有这样的印象,我所问的并不是不可能的 我在一个类中创建了一个泛型方法,我想检查传递给该方法的对象的类型。我知道它不能直接完成,因此我将对象Classobj传递给该方法。但是,我无法找到在方法体中正确执行类型检查的方法 public <T> void readData(T obj1, Class<T> obj2){ } public void readData(T
Class
obj传递给该方法。但是,我无法找到在方法体中正确执行类型检查的方法
public <T> void readData(T obj1, Class<T> obj2){
}
public void readData(T obj1,类obj2){
}
假设T
始终属于三种类型之一:ClassA
、ClassB
或ClassC
。if-else-if块应该是什么样子?Use将obj1
强制转换到由obj2
表示的类或接口,如果obj1
可分配给类型T
(注意null
可分配给任何类型),则返回obj1
,否则抛出ClassCastException
我们对强制转换的结果不感兴趣,因为静态已知类型的obj1
已经是T
和obj2.cast(obj1)==obj1
(如果强制转换成功)。但是,如果强制转换失败,将抛出早期异常
例如:
public <T> void readData(T obj1, Class<T> obj2){
obj2.cast(obj1);
//...
}
我想最糟糕的情况是
if(obj1 instanceof ClassA){…}if(obj1 instanceof ClassB){…}..
您可以始终执行obj1.getClass().getSimpleName().equals(对于obj2相同),从而知道它们的名称是否相等,否则我不明白为什么要发送两个参数。@luigimendoza是正确的。在这种情况下,您甚至不需要obj2。您将实际问题简化为抽象问题。然而,剩下的还不足以理解——从而解决——您最初的问题。什么对象,什么类?据我所见,您有一个T
的实例,并且希望重新断言它是T
的实例。这是多余的。@infeed,我理解你的意思,但是类对象允许一个更简单的方法<如果obj1
是obj2
类的实例,则isInstance(obj1)将返回true。尽管这仍然没有用处,因为根据泛型方法的定义,obj1
始终是obj2
类的实例。
readData("Hello",(Class<String>)(Class<?>)Integer.class);
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
//...
}