2012-05-07 16 views
6

uczę Java rodzajowy, mam szkopuł do jakiegoś problemu uruchamianiu tego typu otrzymane od parametrów ogólnych (jest to możliwe w języku C# chociaż)instancji generycznych za

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

Próbowałem to: generics in Java - instantiating T

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

błąd:

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

To nie działa. Poniższa wygląda ok, ale to wiąże instancji niektóre klasy nie mogą być stosowane w metodzie statycznej: Instantiating generics type in java

public class Abc<T> 
{ 

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

} 

Jest to typ wymazywania Java ludzie mówią? Czy to jest ograniczenie wymazywania typu?

Co to jest obejście tego problemu?

Odpowiedz

8

Byłeś bardzo blisko. Trzeba wymienić Class<?> (co oznacza „klasę wszelkiego rodzaju”) z Class<T> (co oznacza „klasę typu T”):

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

+1 i zaakceptowane, nie tak eleganckie, jak C#, choć (nie swój wina ;-)). Btw, to jest to, co nazwali typem wymazania, dlatego nie może bezpośrednio utworzyć wystąpienia T? – Hao

+1

@Hao: exact: rzeczywisty typ T nie jest dostępny w czasie wykonywania, dlatego musisz przekazać obiekt klasy, aby był wyraźny. –

Powiązane problemy