2009-07-07 13 views

Odpowiedz

33

tak że generyczne wpisywanych metody mogą być stosowane -

Class<Foo> klass = Foo.class; 
Foo f = klass.newInstance(); 
Foo f = klass.cast(Object); 
+0

Ostrzeżenie dla każdego, kto uważa, że ​​ta odpowiedź jest poprawna, ponieważ została przyjęta: To nie może być poprawne, ponieważ kod się nie kompiluje. 'klass' jest niezainicjowany przed użyciem. –

+5

... (kontynuacja): Zauważ, że kod, który się kompiluje - czyli 'Class klass = Foo.class;' - błaga oryginalne pytanie, ponieważ 'Foo.class' pozornie dostarcza już niezbędnych informacji. Jednak umiejętność posługiwania się rodzajowymi metodami jest poprawną odpowiedzią; to nie jest jasne z podanego tutaj przykładu. –

14

Jest krótka wzmianka o tym w sekcji Generics wersji 1.5 podręcznika językowego:

Co bardziej zaskakujące, klasa klasy została uogólniona. Literały klas działają teraz jako tokeny typów, dostarczając informacje o czasie wykonywania i czasie kompilacji. Umożliwia to styl fabryk statycznych przykładem metodą getAnnotation w nowym interfejsie AnnotatedElement:

<T extends Annotation> T getAnnotation(Class<T> annotationType); 

Jest to metoda rodzajowa. Wywodzi on wartość jego typ parametru T z jego argumentów i zwraca odpowiednią instancję T, jak pokazano w poniższym przykładzie:

Author a = Othello.class.getAnnotation(Author.class); 

Przed generycznych, byś miał do oddania wynik dla autora. Też byś nie miał możliwości, aby sprawdzić kompilatora, że ​​rzeczywisty parametr reprezentowany podklasę Adnotacja

7

Prawdziwym powodem jest podane przez Neil Gafter:

Gdy dodaliśmy rodzajowych Java w JDK5, Zmieniłem klasę java.lang.Class, aby stała się typem ogólnym. Na przykład typ String.class jest teraz klasy < String>. Gilad Bracha ukuł do tego celu określenia tokenów typu . Moim zamiarem było umożliwienie określonego stylu API, , który Joshua Bloch nazywa wzorcem THC, lub heterogenicznym pojemnikiem Typesafe, .

Powiązane problemy