2012-10-07 18 views
5

Jeśli mam coś takiego:Przechwytywanie typ rodzajowy w Java

class Test<T extends X> { 
    public T test() { 
     T t = /* ... */; 
     return t; 
    } 
} 

Jak mogę uchwycić T „s klasa, więc mogę go instancji? Czy istnieją obejścia zapobiegające usunięciu typu? Nie muszę nawet mieć dostępu do metod T, X będzie dobrze, ale muszę zwrócić T.

Odpowiedz

4

Jedyną rzeczą, którą możesz zrobić, to przekazać klasę T jako dodatkowy argument, albo do test() lub ustawić pole elementu w klasie Test. Nie można zapobiec usunięciu typu.

class Test<T extends X> { 
    private Class<T> mClass; 
    public Test(Class<T> c) { 
     mClass = c; 
    } 
    public T test() { 
     T t = mClass.newInstance(); 
     return t; 
    } 
} 

Lub możesz przekazać obiekt fabryczny do tego samego efektu. Działa to dobrze, gdy musisz użyć czegoś innego niż domyślny konstruktor.

+0

mClass.getConstructor(). NewInstance() jest lepszy, ponieważ nie ukrywa sprawdzonych wyjątków, ale prawidłowo je zawija w InvocationTargetException. –

3

zdefiniować jako:

class Test<T extends X> 
{ 
    public T test(Class<T> c) 
    { 
     T t = c.newInstance(); 
     return t; 
    } 
} 

i używać go jak:

Test<Foo> t = new Test<Foo>(); 
t.test(Foo.class); 
0

Nie można zrobić to bezpośrednio, ale można dodać, że T implementuje interfejs do tworzenia instancji, lub tablica z T.

Powiązane problemy