Direktes return eines Array geht nicht

LimDul

Top Contributor
Rein aus Neugierde, warum funktioniert folgender Code nicht (wird irgendwo mit Sicherheit in der java Language Specification stehen)

Java:
public Class<?>[] getClasses() {
  return { SomeClass.class };
}
aber folgender Code:

Java:
public Class<?>[] getClasses() {
  Class<?> c[] ={ SomeClass.class };
  return c;
}

Und als Follow-Up - Gibt es eine einfache Möglichkeit, das in einer Zeile zu schreibe?
 
Beste Antwort
An array initializer may be specified in a field declaration (§8.3, §9.3) or local variable declaration (§14.4), or as part of an array creation expression (§15.10.1), to create an array and provide some initial values.
Array Initializer (das mit den geschweiften Klammern) ist nur bei Variableninitialisierung (und bei Arrayerzeugung) erlaubt.

Eine Zeile:
Java:
public Class<?>[] getClasses() {
  return new Class<?>[] { SomeClass.class };
}
An array initializer may be specified in a field declaration (§8.3, §9.3) or local variable declaration (§14.4), or as part of an array creation expression (§15.10.1), to create an array and provide some initial values.
Array Initializer (das mit den geschweiften Klammern) ist nur bei Variableninitialisierung (und bei Arrayerzeugung) erlaubt.

Eine Zeile:
Java:
public Class<?>[] getClasses() {
  return new Class<?>[] { SomeClass.class };
}
 
Beste Antwort

All of this results from a known, and deliberate, weakness of generics in Java: it was implemented using erasure, so "generic" classes don't know what type argument they were created with at run time, and therefore can not provide type-safety unless some explicit mechanism (type-checking) is implemented.
 
Also ich bin kein Fan davon... wenn da etwas steht, was man gar nicht braucht.

Obwohl... das ist ja mit Gartenzwergen auch so.
 
Welchen Vorteil habe ich den vom weglassen der Generics? Ich sehe nur Nachteile:
- Ich bekomme eine Warning
- Man sieht dem Code nicht mehr an, ob das Absicht ist, dass da kein Generics-Type steht oder ob der vergessen wurde

So mache ich klar, dass ich an der Stelle eben keinen konkreten Type angeben kann. Was den Code deutlich klarer macht meines Erachtens.
 
Es macht halt auch einfach einen Unterschied.


Möchte jemand raten, was in beiden Fällen passiert?

Java:
Class c = ...
c.getAnnotationsByType(Object.class);
Java:
Class<?> c = ...
c.getAnnotationsByType(Object.class);
 
Was mach ich den deiner Ansicht nach gegen die Warning? Vernünftiger Code hat Warning-Frei zu sein.
Du schreibst also ganz genau folgendes:
Java:
public Class<?>[] getClasses() {
  return new Class<?>[] { SomeClass.class };
}
 
Dann schreibe eine E-Mail an James Gosling oder nutze eine andere JVM-Sprache als Java.
Für alle anderen: So und nicht anders ist der Weg, um einen Producer (die Methode) eines parametrisierten Typs zu deklarieren, bei dem der Typparameter für den Konsumenten egal ist.
 
Ich find das auch ok so. Ich mache lieber Dinge explizit (Hier <?>) als implizit durch weglassen. Bei Generics gibt es andere stellen die mich mehr stören. Je nach Verwendung (? extends ...) kann es passieren, dass man casten muss obwohl es eigentlich nicht notwendig sein muss.
 

Zurück
Oben