Как вернуть экземпляр объекта того же типа, что и класс, переданный с использованием Java 6?

Я хочу вернуть экземпляр объекта того же типа объекта класса, который прошел. Тип, передаваемый в, может быть НИЧЕГО. Есть ли способ сделать это с помощью 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);

Ответ 1

Я предполагаю, что вы хотите создать новый экземпляр этого класса. Это невозможно было бы использовать с помощью дженериков (вы не можете вызвать 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().

Ответ 2

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

Ответ 3

Если вы не пытаетесь сделать что-то необычное с объектом во время создания, что неправильно с использованием старых старых конструкторов?

Вы должны использовать что-то похожее на:

public T getObject<T>(T obj)
{
  return obj.newInstance();
}

Ответ 5

public Object getObject(Class clazz) {
  return clazz.newInstance();
}

Создает новый объект указанного класса. Вам не нужно использовать дженерики для этого.