我想返回传入的Class对象的相同类型对象的实例。传入的类型可以是ANYTHING。有没有办法用Generics做到这一点?
澄清 - 我不希望方法的调用者不必转换为他们传入的对象的类
例如,
public Object<Class> getObject(Class class)
{
// Construct an instance of an object of type Class
return object;
}
// I want this:
MyClass myObj = getObject(MyClass.class);
// Not this (casting):
MyClass myObj = (MyClass)getObject(MyClass.class);
答案 0 :(得分:16)
我假设您要创建该类的新实例。这不可能使用泛型(你不能调用new T()
),并且使用反射也是非常有限的。
反思方法可能是:
//class is a reserved word, so use clazz
public <T> T getObject(Class<T> clazz) {
try {
return clazz.newInstance();
}
catch( /*a multitude of exceptions that can be thrown by clazz.newInstance()*/ ) {
//handle exception
}
}
请注意,这仅在类具有无参数构造函数时才有效。
然而,问题在于您需要这样做而不是仅仅呼叫new WhatEverClassYouHave()
。
答案 1 :(得分:4)
public <C> C getObject(Class<C> c) throws Exception
{
return c.newInstance();
}
用法示例:
static <C> C getObject(Class<C> c) throws Exception {
return c.newInstance();
}
static class Testing {
{System.out.println("Instantiated");}
void identify(){ System.out.println("Invoked"); }
}
public static void main(String args[]) throws Exception {
Testing t = getObject(Testing.class);
t.identify();
}
答案 2 :(得分:1)
如果你在创作过程中没有试图对这个对象做任何事情,那么使用一个好的老式构造函数有什么不对?
你应该可以使用类似的东西:
public T getObject<T>(T obj)
{
return obj.newInstance();
}
答案 3 :(得分:0)
您不必实施此方法,它已经存在:
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance%28%29
用法:
Class<T> type = ...;
T instance = type.newInstance();
答案 4 :(得分:-1)
public Object getObject(Class clazz) {
return clazz.newInstance();
}
将创建指定类的新对象。您不必为此使用泛型。