2012-05-07 14 views
6

sto imparando di Java generici, ho intoppo in qualche problema istanziare il tipo di informazioni ricevuta da parametri generici (questo è possibile in C# però)istanziare generico

class Person { 
    public static <T> T say() { 
     return new T; // this has error 
    } 
} 

ho provato questo: generics in Java - instantiating T

public static <T> T say(Class<?> t) { 
    return t.newInstance(); 
} 

Errore:

incompatible types 
found : capture#426 of ? 
     required: T 

che non funziona. Di seguito sembra ok, ma comporta istanziare una certa classe, non può essere utilizzato su metodo statico: Instantiating generics type in java

public class Abc<T> 
{ 

    public T getInstanceOfT(Class<T> aClass) 
    { 
     return aClass.newInstance(); 
    }  

} 

E 'questo il tipo di cancellazione gente Java stanno dicendo? È questa la limitazione della cancellazione del tipo?

Qual è il modo per aggirare questo problema?

risposta

8

Eri molto vicino. È necessario sostituire Class<?> (che significa "una classe di qualsiasi tipo") con Class<T> (che significa "una classe di tipo T"):

public static <T> T say(Class<T> t) throws IllegalAccessException, InstantiationException { 
    return t.newInstance(); 
} 
+0

+1 e accettata, non è elegante come C# se (non il tuo colpa ;-)). A proposito, è questo che chiamano cancellazione di tipo, ecco perché non può istanziare una T direttamente? – Hao

+1

@Hao: esattamente: il tipo effettivo di T non è disponibile in fase di esecuzione, ecco perché è necessario passare in un oggetto Class per renderlo esplicito. –

Problemi correlati