Как вернуть экземпляр объекта того же типа, что и класс, переданный с использованием 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();
}
Ответ 4
Вам не нужно реализовывать этот метод, он уже существует:
http://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance%28%29
Использование:
Class<T> type = ...;
T instance = type.newInstance();
Ответ 5
public Object getObject(Class clazz) {
return clazz.newInstance();
}
Создает новый объект указанного класса. Вам не нужно использовать дженерики для этого.