像在C#中一样解决Java中的泛型方法,泛型参数类型?

时间:2010-08-11 14:22:22

标签: java generics

如何在Java中检查泛型参数的类型(如果可能,不使用反射)?

目标就像C#允许的那样:

public <T> void  doStaff() {

  if(T is Type1) {

  }

  if(T is Type2) {

  }

}

如何在Java中编写类似的方法?

4 个答案:

答案 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运算符来确定该对象是否是特定类的实例,但您无法对实际泛型参数本身执行任何操作,因为它在运行时被类型擦除。