2009-05-26 7 views
9

Czy istnieje sposób przechowywania typowego parametru przekazywanego w trakcie budowy do parametru. Mój cel:Klasa klasy ogólnej w polu w języku Java

class generic<T> { 
    Class<T> type; 
    public generic() { 
     super(); 
     this.type = //Something that gets class from T 
    } 
} 

Co mam obecnie robi to:

class generic<T> { 
    Class<T> type; 
    public generic(Class<T> type) { 
     super(); 
     this.type = type; 
    } 
} 

Wydaje się głupie, aby określić klasę dwa razy, ale nie jestem pewien jak inaczej to zrobić. Myślę, że to może być możliwe dzięki refleksji, ale jeszcze tego nie zbadałem. Czy istnieje bardziej prosty sposób? Jeśli nie (na marginesie), dlaczego utrata informacji?

+0

Jeśli używasz generycznych, dlaczego chcesz/potrzebujesz klasy? Ma to dziwny zapach. – Instantsoup

+0

Zgoda, nie powinieneś potrzebować dostępu do ogólnego parametru w czasie wykonywania, ponieważ generics to tylko funkcja typu kompilacji ... –

Odpowiedz

10

Ponieważ rodzajowych Java są realizowane z Type Erasure

Gdy typ rodzajowy jest tworzony, kompilator tłumaczy te typy przez technika zwana typu usunięcia - do proces, w którym kompilator usuwa wszystkie informacje związane z wpisz parametry i wpisz argumenty w klasie lub w metodzie . Typ erasure umożliwia aplikacjom Java , które używają generics do , zachowują kompatybilność binarną z bibliotekami Java i aplikacjami, które zostały utworzone przed generycznymi.

3

Typ ten nie jest zachowywany w środowisku wykonawczym, więc nie można go traktować jako parametru. Generics in java to koncepcja ściśle kompilacyjna (ze względu na kompatybilność wsteczną). Nazywa się to Type Erasure.

Jednym z powodów, dla których obiekt klasy przyjmuje parametr typu, jest właśnie obejście tego problemu, więc można pobrać obiekt klasy, aby programowo go reprezentował.

8

Jeśli używasz statycznej metody tworzenia z wnioskiem typu zamiast konstruktora, wówczas typ nie musi być podawany dwa razy.

final class Generic<T> { 
    private final Class<T> type; 
    private Generic(Class<T> type) { 
     super(); 
     if (type == null) { 
      throw new NullPointerException(); 
     } 
     this.type = type; 
    } 
    public static <T> Generic<T> newInstance(Class<T> clazz) { 
     return new Generic<T>(clazz); 
    } 
} 
... 
    someFunction(Generic.newInstance(SomeType.class)); 

Oczywiście, jeśli chcesz zapisać wynik w zmiennej, prawdopodobnie i tak będziesz powtarzać ten typ!

Powiązane problemy