2012-03-20 1 views
12

Я хочу вернуть экземпляр объекта того же типа объекта класса, который прошел. Тип, переданный в, может быть НИЧЕГО. Есть ли способ сделать это с помощью Generics?Как вернуть экземпляр объекта того же типа, что и класс, переданный с использованием Java 6?

Для уточнения - я не хочу, вызывающую метода не должен отбрасывать к классу объекта, они прошли в

Например,

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

ответ

14

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

+0

Бросок не требуется. – Puce

+0

@ Положите, что вы правы :) – Thomas

+0

Листинг кажется необходимым (получена ошибка без него) – BestPractices

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

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

+0

Вы должны использовать Generics, если вы не хотите, чтобы бросить позже. – Puce

+0

Как сказал Пуче, я не хочу бросать позже ... – BestPractices

+0

Да, вы позже отредактировали свой вопрос - Class является общим, поэтому вы можете использовать то, что выложил Чак. – manub

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

Но этот метод ничего не добавляет ... – Puce

+0

@Puce - я отредактирую и добавлю пример использования. Удерживать ... – Java42

+0

Тем не менее, getObject ничего не добавляет. Вы можете просто использовать: Тестирование t = Testing.class.newInstance(); и избавиться от метода getObject – Puce

1

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

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

public T getObject<T>(T obj) 
{ 
    return obj.newInstance(); 
} 
Смежные вопросы