Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在运行时确定泛型类的类型_Java_Generics_If Statement - Fatal编程技术网

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
 //...
}