如何在Java中检查泛型参数的类型(如果可能,不使用反射)?
目标就像C#允许的那样:
public <T> void doStaff() {
if(T is Type1) {
}
if(T is Type2) {
}
}
如何在Java中编写类似的方法?
答案 0 :(得分:4)
public <T> void doStaff(Class<T> type) {
if (Type1.class.isAssignebleFrom(type)) {.. }
if (Type2.class.isAssignebleFrom(type)) {.. }
}
答案 1 :(得分:3)
Java中的通用信息在运行时被擦除。你永远不能做像“T instanceof”这样的事情。但是,您可以将某些内容传递给方法,并执行引用的实例,如下所示:
public T void doStaff(T t) {
if (t instanceof Type1) {...}
}
为了更清楚,T是一个通用参数,在运行时消失。 t是您可以在运行时处理的引用。
答案 2 :(得分:0)
在Type的类
上使用Class.isAssignableFrom(Class)方法import java.io.Serializable;
import java.util.Hashtable;
public class Test<T> {
private T t;
public void set(T t) {
this.t = t;
}
private T get() {
if(Serializable.class.isAssignableFrom(t.getClass())) {
System.out.println("Hurray!!!");
}
return t;
}
public static void main(String[] args) {
Test<Hashtable> test = new Test<Hashtable>();
test.set(new Hashtable());
test.get(); // prints Hurray!!
}
}
答案 3 :(得分:0)
Java使用类型擦除来处理泛型。这意味着只有在编译时检查有关泛型的所有信息,并且生成的字节码根本没有参考使用泛型的事实。
List<String> stringList = new ArrayList<String>();
stringList.add("foo");
String s = stringList.get(0);
将(在对通用参数进行编译时检查之后)将基本编译为与
相同的东西List stringList = new ArrayList();
stringList.add("foo");
String s = (String)(stringList.get(0));
这意味着你不能直接对泛型参数进行任何运行时检查,就像你想要做的那样。
如果您有一个泛型类型的特定对象,您可以使用instanceof
运算符来确定该对象是否是特定类的实例,但您无法对实际泛型参数本身执行任何操作,因为它在运行时被类型擦除。