2010-08-19 19 views

Odpowiedz

9

Można to zrobić, ale type erasure może to bardzo trudne. Jak inne odpowiedzi dyskutują, albo musisz zrobić podklasę ParameterizedClass lub dodać pole typu T do ParameterizedClass, a kod odbicia, który musisz zrobić, jest zawiłowany.

Co mogę polecić w tych okolicznościach jest obejść ten problem tak:

class ParameterizedClass<T> { 
    private Class<T> type; 

    /** Factory method */ 
    public static <T> ParameterizedClass<T> of(Class<T> type) { 
     return new ParameterizedClass<T>(type); 
    } 

    /** Private constructor; use the factory method instead */ 
    private ParameterizedClass(Class<T> type) { 
     this.type = type; 
    } 

    // Do something useful with type 
} 

ze względu na rodzaj wnioskowania Java dla metody statyczne, można skonstruować swoją klasę bez zbytniego dodatkowego boilerplate:

ParameterizedClass<Something> foo = ParameterizedClass.of(Something.class); 

W ten sposób Twoja ParameterizedClass jest w pełni generyczna i bezpieczna, a ty nadal masz dostęp do obiektu klasy.

EDIT: Skierowany komentarz

+0

It *** IS *** possible. Ta odpowiedź jest błędna. Sprawdź drugą odpowiedź, która ma rozwiązanie. –

+0

@AdamArold Nie wiedziałem o tym jeszcze w momencie, gdy pisałem odpowiedź, ale masz rację. Wciąż tego nie polecam. Odpowiednio zaktualizowałem swoją odpowiedź. – jqno

8

Można użyć tego triku w konstruktorze: (patrz http://www.hibernate.org/328.html)

Class<T> parameterType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; 

Ale wierzę, ten kod działa tylko wtedy, gdy klasa jest sub-klasyfikowane i instancją podklasy wykonuje go.

+0

Znam tę sztuczkę i używam na zajęciach DAO. Ale to nie jest to, na co patrzę. Aby użyć tej sztuczki, myślę, że musimy zdefiniować rzeczywistą wartość ogólnego rodzaju klasy macierzystej na kodzie źródłowym. GenericDAO UserDAO rozszerza GenericDAO TanerDiler

3

Jeśli chodzi ci tylko o sam przedmiot, nie możesz. Usunięcie typu oznacza utratę informacji.

Jeśli masz pole który wykorzystuje parametryczne typ z betonową typu argumentu choć że informacja jest zachowana.

Zobacz Angelika Langer's Generics FAQ, a zwłaszcza section on type erasure.

0

Jest to głównie problematyczny temat, ponieważ działa tylko pod pewnymi warunkami, jak oczekiwano (expecially w złożonych scenariuszy).

Ale Xebia opublikowała good article na całość.

Powiązane problemy