我想使用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);
我这太复杂了吗?
答案 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;
}
}
}
但正如您所看到的,您需要传入您尝试实例化的类的对象,这可能不是您想要的。在这种情况下,唯一的另一种选择是传入一个用泛型类型参数化的类,原因是其他海报已经雄辩地说明了这一点。