如何返回与使用Java 6传入的类相同类型的对象的实例?

时间:2012-03-20 16:31:08

标签: java generics

我想返回传入的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);

5 个答案:

答案 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();
}

将创建指定类的新对象。您不必为此使用泛型。