Class<CAP#1> statt Class<...>

dowhile

Mitglied
Hallo,

ich habe folgenden Quelltext:

Java:
for (Map.Entry<String, AbstractLayer> entry : layers.entrySet()) {
    Class<AbstractLayer> c = entry.getValue().getClass();
}

Dabei wird folgende Fehlermeldung erzeugt:

Code:
incompatible types
  required: Class<AbstractLayer>
  found: Class<CAP#1>
  where CAP#1 is a fresh type-variable:
    CAP#1 extends AbstractLayer from capture of ? extends AbstractLayer

Ich verstehe nicht so ganz, wieso ich das nicht machen darf. entry.getValue() liefert ein Objekt von AbstractLayer. Wieso ist dessen Klassenobjekt dann kein Class<AbstractLayer>?

Mit freundlichen Grüßen

(Entschuldigt bitte, dass ich das in diesem Unterforum gepostet habe; es handelt sich hierbei wohl eher um ein Anfängerproblem - vielleicht kann es ja verschoben werden ...)
 
Zuletzt bearbeitet:
Object.getClass() liefert (wenn nicht überschrieben) ein objekt vom type "Class<?>" ...
wenn man also "getClass()" called MUSS man "Class<?>" verwenden ...
 
(wenn nicht überschrieben)
Dann überschreib mal eine finale Methode.

wenn man also "getClass()" called MUSS man "Class<?>" verwenden
Falsch.

Korrektur:
Java:
for (Map.Entry<String, AbstractLayer> entry : layers.entrySet()) {
    Class<? extends AbstractLayer> c = entry.getValue().getClass();
}

Steht übrigens auch in der Doku: [JAPI]Object#getClass()[/JAPI] :rtfm:
 
getClass() is native final ? naja who cares ... hab den source auch nich 100% im kopf ... (wobei man hier mal das standard-doclet anpassen könnte das auch "native" und "final" in der doc zu lesen sind)

und ob man nun <?> oder <? extends Object> schreiben muss ändert nichts daran das <Object> nicht geht ...
 
getClass() is native final ? naja who cares ...
Also ich bin schon daran interessiert, dass mir nicht jemand eine falsche Klasse unterjubuln kann, in dem er die Methode überschreibt.

hab den source auch nich 100% im kopf ... (wobei man hier mal das standard-doclet anpassen könnte das auch "native" und "final" in der doc zu lesen sind)
Es ist ja nett, helfen zu wollen, aber eine falsche Antwart ist nun mal schlechter als gar keine.

und ob man nun <?> oder <? extends Object> schreiben muss ändert nichts daran das <Object> nicht geht ...

Es geht aber [c]<? extends KonkreteKlasse>[/c], was lesende Aufrufe an [c]KonkreteKlasse[/c] zulässt. Siehe dazu Kovarianz und Kontravarianz ? Wikipedia
 

Zurück
Oben