Collections.emptySet() und triärer Operator

Status
Nicht offen für weitere Antworten.

Andreas29

Bekanntes Mitglied
Hi Leute,

folgende Zeile Code ist ja vollkommen legal und wird vom Compiler auch korrekt interpretiert:
Code:
Set<String> s = Collections.emptySet();

Nur warum schmeißt folgende Zeile dann einen Compilerfehler?
Code:
Set<String> s = anotherSet.isEmpty() ? Collections.emptySet() : new HashSet<String>()

Der Compilerfehler lautet:
cannot convert from Set<capture#1-of ? extends Object> to Set<String>

Kann mir das bitte irgendwer erklären?

Danke und Grüße,
Andreas
 

Landei

Top Contributor
Geht's so?

Java:
Set<String> s = anotherSet.isEmpty() ? Collections.<String>emptySet() : new HashSet<String>();
 

musiKk

Top Contributor
Generisch funktionierts.

Aber nochmal zum ursprünglichen: Der Fehler tritt irgendwie nur im Eclipse-Compiler auf. Der Sun-Compiler nimmts mit einer Warning:
Code:
Test.java:6: warning: [unchecked] unchecked conversion
found   : java.util.Set
required: java.util.Set<java.lang.String>
                Set<String> s = (args.length == 0) ? Collections.emptySet() : ne
w HashSet();
                                                   ^
1 warning
So wirklich erklären kann ichs mir aber im Moment auch nicht.
 
S

SlaterB

Gast
Ternärer Operator, liefert zwei Typen, also wird auf den höchsten gemeinsamen gecastet,
in diesem Fall Set<?>
 

Andreas29

Bekanntes Mitglied
Hi,

danke für die Antworten.

@SlaterB:
Das habe ich noch nicht so ganz verstanden. Ich meine, es ist klar, Collections.emptySet liefert ein Set<?> zurück, das ist klar. Und new HasSet<String> liefert ein HashSet für String-Objekte, auch klar. Und der gemeinsame parent ist natürlich Set<?>. Das ist auch klar, nur warum kann er dann im ersten Fall ohne Murren ein Set<?> in ein Set<String> speichern? Wenn er das intern castet, warum tut er dass dann beim trenären Operator nicht? Das verstehe ich noch nicht...

Grüße,
Andy
 

Illuvatar

Top Contributor
Dass die
Java:
Set<String> s = Collections.emptySet();
Version funktioniert, nennt sich generic type inference. Collections.emptySet gibt nämlich kein Set<?> zurück, sondern ein Set<T>. In der Version ohne den ternären Operator ist der Compiler so intelligent, selbst den richtigen generischen Parameter (<String>) für die Methode zu wählen. In der anderen Version offensichtlich nicht - scheint mir eine kleine Schwachstelle zu sein. Da die type inference hier nicht greift, sieht der Compiler das tatsächlich als Set<?> und damit wird der ganze Ausdruck zu einem Set<?>. Landeis Schreibweise scheint die beste Lösung zu sein.

siehe auch: Effective Java, Items 1 und 27
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K jackson deserializer - Collections Allgemeine Java-Themen 6
D Collections.sort funktioniert nicht in exportierten .class Dateien Allgemeine Java-Themen 10
Hacer Generics & Collections Allgemeine Java-Themen 8
C Generic collections und static typing Allgemeine Java-Themen 4
J Collections, Locks und volatile ? Allgemeine Java-Themen 1
A Compiler-Fehler Woher kommt der NullPointer? (Collections & Iterator) Allgemeine Java-Themen 7
E Collections Collections die Subojekte einer Klasse enthält? Allgemeine Java-Themen 7
O Collections Eigene Methodenzusicherung bei Collections als Parameter Allgemeine Java-Themen 2
D generische Klasse für alle Maps (nicht Collections :-)) Allgemeine Java-Themen 11
B zwei-dimensionale Collections bzw. Array mit Indizes Allgemeine Java-Themen 3
Landei immutable Collections Allgemeine Java-Themen 27
J Collections in Instanzattributen als Kopie übergeben Allgemeine Java-Themen 4
J Rätselhaftes Verhalten von Collections Allgemeine Java-Themen 5
M Double Braces Notation um Collections zu initialisieren Allgemeine Java-Themen 9
W Komplexität von addAll() bei Collections Allgemeine Java-Themen 4
K Collections oder Vektoren sicher zu serialisieren? Allgemeine Java-Themen 5
W sortierte Iteration über Set oder Map, bzw. Collections Allgemeine Java-Themen 5
C Viele Informationen aus zwei Collections vergleichen Allgemeine Java-Themen 2
S Wie "zufällig" ist Collections.shuffle(.) Allgemeine Java-Themen 1
S Collections.binarySearch(list,"a") Allgemeine Java-Themen 7
T Sortierung mit Collections.sort() Allgemeine Java-Themen 4
J Collections Allgemeine Java-Themen 2
F Vererbung, Generizität und Collections. Allgemeine Java-Themen 7
G Collections als Array implementieren Allgemeine Java-Themen 2
F Naming Conventions (Collections) Allgemeine Java-Themen 8
K Elegante Lösung zum Manipulieren von Collections gesucht Allgemeine Java-Themen 16
T Collections/Arrays sortieren => ä, ö, ü, ß Groß/klein Allgemeine Java-Themen 3
R Probleme mit Collections - Teil 2 Allgemeine Java-Themen 4
R Probleme mit Collections Allgemeine Java-Themen 5
L-ectron-X Problem mit Collections.sort() mit Java 1.5 Allgemeine Java-Themen 9
C Collections.binarySearch Allgemeine Java-Themen 1
R Entsprechung von Stack() im Collections Framework...? Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben