2013-02-28 14 views
8

Potrzebuję skorzystać z refleksji w java. Rozumiem, że Class clazz tworzy zmienną reprezentującą obiekt Class. Jednak próbuję odwołać się do obiektu Class z String przy użyciu metody forName("aClassName"). Moje IDE (Eclipse) wydaje się preferować notację Class<?> clazz dla deklarowania zmiennej. Widziałem tę notację wiele razy w innym miejscu. Co to znaczy?Jaka jest różnica między klasą clazz a klasą <?> clazz w java?

Edytuj: Usunięto odniesienie do operatora trójargumentowego, ponieważ nie jest istotne dla tego pytania.

+2

W jaki sposób jest to związane z operatorem trójskładnikowym? Nie ma tu operatorów. –

+0

W tym kontekście, który nie jest potrójnym operatorem, jest to niezwiązany symbol wieloznaczny. – Perception

Odpowiedz

22

Class jest surowy typ - to w zasadzie typ rodzajowy, że jesteś traktując jakby nie wiedział o generyków w ogóle.

Class<?> to typ rodzajowy stosując niezwiązanego wieloznaczny - to w zasadzie oznacza „Class<Foo> jakiegoś rodzaju Foo, ale nie wiem co”.

Podobnie można mieć symboli wieloznacznych z granicami:

  • Class<? extends InputStream> oznacza „Class<Foo> jakiegoś rodzaju Foo, ale nie wiem, co tak długo, jak to InputStream lub podklasą”

  • Class<? super InputStream> oznacza "Class<Foo> dla pewnego typu Foo, ale nie wiem, o ile jest to InputStream lub nadklasa"

Patrz także Java Generics FAQ dla partii Więcej informacji:

a języka Java Specification:

W szczególności z surowego sekcji typów:

Surowce typy są ściśle związane z symboli wieloznacznych. Oba oparte są na typach egzystencjalnych. Typy surowe mogą być traktowane jako symbole wieloznaczne, których reguły typów są celowo niesłuszne, w celu umożliwienia interakcji ze starszym kodem. Historycznie surowe typy poprzedzały symbole wieloznaczne; zostały one po raz pierwszy wprowadzone w GJ i opisane w artykule "Bezpieczna przyszłość w przeszłości": Dodanie generyczności do języka programowania Java przez Gilada Brachę, Martina Odersky'ego, Davida Stoutamire i Philipa Wadlera w Obradach Konferencji ACM na temat Orientowane programowanie, systemy, języki i zastosowania (OOPSLA 98), październik 1998.

+0

Ale, technicznie rzecz biorąc, nie ma żadnej różnicy między typem surowym a niezwiązanym symbolem wieloznacznym, prawda? Mam na myśli, poza unikaniem ostrzeżeń kompilatora i zwiększaniem czytelności kodu. – Gothmog

+1

@Gothmog: Są przypadki, w których może wpływać na przesłonięcie i przeciążenie, ze względu na sposób obsługi typów surowych (IIRC). –

+0

Dzięki Jon, doceniamy! –

0

W typów generycznych wildcard ? oznacza „niezależnie od klasy” (tak Class<?> jest taka sama jak tylko Class ale jako surowca typu prawidłowo parametryzowane).

2

Pierwszą rzeczą, którą należy sobie uświadomić, jest to, że w tym przypadku "?" NIE jest operatorem potrójnym, ale jest częścią implementacji generycznych języka Java i wskazuje, że typ klasy jest nieokreślony, ponieważ niektóre inne odpowiedzi już wyjaśniły.

Aby wyjaśnić pytanie dotyczące operatora trójskładnikowego, jest to bardzo proste.

Wyobraź sobie, że istnieją następujące if:

boolean correct = true; 
String message; 

if (correct) { 
    message = "You are correct."; 
} else { 
    message = "You are wrong."; 
} 

można przepisać że z operatorem potrójnego (myślę o nim jako operatora if-else-skrótów):

message = (correct) ? "You are correct." : "You are wrong."; 

jednak najlepiej jest unikać operatora trójskładnikowego dla wszystkich oprócz najprostszych instrukcji, aby poprawić czytelność kodu.

+0

Widzę, miałem wrażenie, że '?' Zawsze był określany jako operator trójskładnikowy. Teraz widzę, że jest to nieprawidłowe. Czy często używa się potrójnych operatorów, czy jest to funkcja, która była bardziej popularna w przeszłości? –

+0

Powiedziałbym, że nadal jest w użyciu, ale ogólnie unika się go. Wciąż widzę, że pojawia się w kodzie od czasu do czasu, więc dobrze jest wiedzieć, jak to przeczytać. Istnieją rzadkie sytuacje, w których posiadanie bardziej zwięzłego stwierdzenia czyni je bardziej przejrzystym. To jedyny moment, w którym rozważałbym skorzystanie z tego, jeśli/else. – yogaphil

Powiązane problemy