使用类的方法结果中的泛型类

时间:2012-01-12 22:13:11

标签: java generics

我想使用Java中通用方法设置捕获的类信息来创建实例。但是我没有看到如何在没有实际实例的情况下引用该类。有可能吗?

public class Fancy {

static public <TypeToFind> TypeToFind createInSomeCase() {
  // any type of logic with TypeToFind "class" generic will do, I just want to reference it.

  // the below code is invalid, I could also declare a variable, but can't always create an instance to get the class
  if (TypeToFind.getClass().equals(Something.class)) {
    return TypeToFind.getInstance();
  }
}


}

...以后我可以这样做:

TheResultIsTheParameter t = Fancy.createInSomeCase();

...而不是

TheResultIsAParameter t = Fancy.createInSomeCase(TheResultIsAParameter.class);

......或

TheResultIsAParameter t = Fancy.createInSomeCase(t);

我这太复杂了吗?

3 个答案:

答案 0 :(得分:6)

你不能这样做,因为泛型在运行时丢失了(由于type erasure)。您必须传递Class<?>参数

答案 1 :(得分:1)

嗯,你需要一些合乎逻辑的想法,不幸的是,Java中的泛型只是一种语法糖用于反思。

List<MyClass> list;
(...)
MyClass my = list.get(0);

将编译为

MyClass my = (MyClass) list.get(0);

这就是你在字节码中看到的内容。

此外,使用反射或强制转换为无类型列表,您可以将任何对象放入list,在这两个代码中,您将获得ClassCastException

因此泛型仅存在于编译器级别。一个很大的功能,不会增加任何新功能,只会缩短大多数案例中的代码。

答案 2 :(得分:1)

只要你不静态地(在编译时)尝试引用任何特定的类,没有什么能阻止你做这样的事情:

public class GenericsTest {
   @Test
   public void testMe() {
      GenericsTest test = new GenericsTest();
      System.out.println(test.get("Hello").getClass());
   }

   public GenericsTest() {
      super();
   }

   public <T extends Object> T get(T entity) {
      return newInstanceForClass((Class<T>)entity.getClass());
   }

   public <T extends Object> T newInstanceForClass(Class<T> clazz) {
      try {
         return clazz.newInstance();
      } catch (Exception e) {
         e.printStackTrace();
         return null;
      }
   }
}

但正如您所看到的,您需要传入您尝试实例化的类的对象,这可能不是您想要的。在这种情况下,唯一的另一种选择是传入一个用泛型类型参数化的类,原因是其他海报已经雄辩地说明了这一点。