2014-02-14 10 views
18

Ich kam in diesem Code:Legendes Klasse <?>

public class RestfulAdage extends Application { 
    @Override 
    public Set<Class<?>> getClasses() { 
    Set<Class<?>> set = new HashSet<Class<?>>(); 
    set.add(Adages.class); 
    return set; 
    } 
} 

Ich verstehe nicht, was Class<?> Mittel.

+0

ich meine Klasse user3134565

+0

prüfen http://stackoverflow.com/questions/290982/java-class-type – Yuan

Antwort

13

Class<?> zu einer Klasse von unbekanntem Typ bezieht. Die Notation verwendet eine unbounded generic, die keine Einschränkung für den Typ der Klasse enthält, die der Sammlung hinzugefügt werden kann. Zum Beispiel würde die folgende nicht funktionieren

Set<Class<String>> set = new HashSet<Class<String>>(); 
set.add(Adages.class); // type not allowed 
+0

, aber wenn das wahr ist, warum ist das dann fehlgeschlagen: set.add ("Hallo") <- ich dachte, es kann jeden Typ annehmen? – user3134565

+0

nur Null hinzufügen? Was nützt das? – user3134565

+1

@ user3134565 - "Hallo" ist String-Instanz, keine Klasseninstanz. Sie können die Menge "String.class", aber keine String-Instanz einfügen. Sie könnten auch "Hallo" .getClass() ' – Avi

5

Es bezieht sich auf gererics. Ich schlage vor, Sie lesen ein wenig darüber. Im Grunde wissen Sie nur zur Laufzeit, mit welchem ​​Objekttyp Sie arbeiten. Zum Beispiel kann die Klasse Integer, String oder sogar YourDefinedClassType
hier lesen http://java.sun.com/developer/technicalArticles/J2SE/generics/

+0

so tut dies bedeutet, dass es jede Art von Objekt, wie String, Integer, Double ... usw. nehmen kann? – user3134565

+1

set.add ("dd") fehlgeschlagen, und nimmt nur null ... warum ist das – user3134565

+0

@ user3134565 lesen Sie über Generika, nicht nur was die Leute Ihnen sagen! Sie können den einfachen Weg nicht lernen. Sie versuchen, eine Instanz eines Objekts hinzuzufügen, benötigen Sie eine Instanz einer Klasse – diazazar

5

Von: (?) Wildcards

In generischem Code, das Fragezeichen, das Wildcard genannt, stellt einen unbekannten Typ. Der Platzhalter kann in verschiedenen Situationen verwendet werden: als Typ eines Parameters, Felds oder einer lokalen Variablen; manchmal als Rückgabetyp (obwohl es eine bessere Programmierpraxis ist, genauer zu sein). Der Platzhalter wird niemals als Typargument für einen generischen Methodenaufruf, eine generische Klasseninstanzerstellung oder einen Supertyp verwendet.

Überprüfen Sie den Link finden Sie ausführlichere Dokumentation finden, Beispiele usw.

7

Klasse ist eine parametrisierbare Klasse, daher können Sie die Syntax-Klasse verwenden, in denen T ein Typ ist. Wenn Sie Class schreiben, deklarieren Sie ein Class-Objekt, das von jedem Typ sein kann (? Ist ein Platzhalter). Der Klassentyp ist ein Typ, der Metainformationen zu einer Klasse enthält.

Es ist immer gut, sich auf einen generischen Typ zu beziehen, indem Sie seinen spezifischen Typ angeben, indem Sie die Klasse verwenden, die Sie beachten (Sie kennen die zu parametrierende Klasse), aber Sie beschränken Ihre Parameter nicht darauf ein bestimmter Typ

Referenz über Generics und Wildcards: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html

Referenz über Klassenobjekt und Reflexion der (Merkmal der Java-Sprache verwendet, sich selbst zu überwachen): (?) http://java.sun.com/developer/technicalArticles/ALT/Reflection/

7

In generischem Code, das Fragezeichen, die so genannte Der Platzhalter repräsentiert einen unbekannten Typ. Der Platzhalter kann in verschiedenen Situationen verwendet werden: als Typ eines Parameters, Felds oder einer lokalen Variablen; manchmal als Rückgabetyp (obwohl es eine bessere Programmierpraxis ist, genauer zu sein). Der Platzhalter wird niemals als Typargument für einen generischen Methodenaufruf, eine generische Klasseninstanzerstellung oder einen Supertyp verwendet.

In den folgenden Abschnitten werden Platzhalter ausführlicher erläutert, einschließlich der oberen begrenzten Platzhalter, der unteren begrenzten Platzhalter und der Platzhaltererfassung.

für weitere Informationen click here

+2

können Sie mir mehr plz – Maythux

+0

für weitere Informationen erklären: http: //docs.oracle.com/javase/tutorial/java/generics/wildcards.html – Danyal

+0

Willkommen Kumpel :). – Danyal

4

wird angenommen, dass Sie eine Reihe von Klassen haben, die zu verschiedenen Typen gehören, und Sie haben Instanzen verschiedener Klassen auch.Wenn Sie also prüfen möchten, ob diese Instanzen instanceof einer dieser Klassen sind, können Sie diese Sätze durchlaufen und die Aufgabe ausführen. Und für diese Art von Arbeit, besser Sie einen völlig uneingeschränkten Satz verwenden:

public boolean checkClasses(Set<Class<?>> typeLessClassSet, Set instances){ 

    while(typeLessClassSet.hasNext()){ 
     Class c = typeLessClassSet.next(); 
     while(instances.hasNext()){ 
      Object o = instances.next(); 
      if(o instanceof c) 
      return true; 
     } 
    } 
     return false;  
} 
Verwandte Themen