List<? implements "Interface"> geht nicht

Status
Nicht offen für weitere Antworten.

Nogge

Mitglied
Hallo Community,
ich möchte folgendes realisieren, woran mich der Java-Compiler allerdings hindert:
Code:
public ArrayList<MyInterface> test() {
   ArrayList<TestObject> result = new ArrayList<TestObject>();
	//...
	return result;
}
TestObject implementiert hierbei natürlich MyInterface. Ich habe bereits folgendes versucht, was ebenfalls zu einem Compiler-Error führte:
Code:
public ArrayList<? implements MyInterface> test() { ... }

Kennt jemand die oder eine elegante Lösung für mein Problem?

Vielen Dank, Nogge
 

hdi

Top Contributor
Wenn du als Rückgabewert eine ArrayList vom Typ MyInterface erwartest, musst du ihm das auch geben.
Du kannst ihm nicht eine Liste von einer Implementation des Interfaces geben, weil das ja ein Spezialfall
ist und er erwartet etwas allgemeineres.

Du kannst natürlich trotzdem TestObject-Objekte in eine <MyInterface> parametrisierte Liste stecken.

Also:

Code:
public ArrayList<MyInterface> test() {
   ArrayList<MyInterface> result = new ArrayList<MyInterface>();
   result.add(new TestObject()); // <-- is ja ok
   return result;
}

Wenn du wirklich speziell eine Liste von dieser speziellen Implementation deines Interfaces willst, dann
musst du auch eine ArrayList<TestObject> als Rückgabewert verlangen.
 

SvenK

Aktives Mitglied
Nur mal als Anmerkung, da ich das hier schon öfters gesehen habe.
So etwas macht man generell nicht:
Code:
ArrayList<MyInterface> result = new ArrayList<MyInterface>();

Immer gegen Interfaces programmieren. So hat man nämlich die Möglichkeit, die konkrete Implementierung zu tauschen.
Also
Code:
 List<MyInterface> result = new ArrayList<MyInterface>();
würde genau so funkionieren wie
Code:
 List<MyInterface> result = new LinkedList<MyInterface>();
 

Nogge

Mitglied
Danke an SvenK und besonders an Capasso!
Ich wollte erst Capasso verbal verstümmeln, aber deine Lösung klappt seltsamer Weise. Ein implements anstelle des extends würde meiner Meinung nach mehr Sinn machen. Extends würde ja eigentlich bedeuten, dass ein anderes Interface dieses erweitert/erbt und nicht, dass eine Klasse eben dieses implementieren muss.
Kann mir jmd eine vernünftige Erklärung dazu liefern oder ist das ein Semantikfehler bei der Konstruktion von Java?
 
S

SlaterB

Gast
es gibt
Class extends Class
Class implements Interface (+ vielleicht noch zusätzlich extends)
Interface extends Interface

-----

nun haben wir
<? ... T> wobei T Class oder Interface sein kann,
-> extends passt 2x (oder 2 1/2 x), implements nur 1x bei drei möglichen Fällen, extends gewinnt ;)

edit:

zudem kann man in eine
List<? extends MyInterface>
auch Objekte vom Typ 'MyInterface2 extends MyInterface' hineinschreiben, es müssen keine richtigen Klassen sein,
falls das nicht klar war
 

Ebenius

Top Contributor
Nogge hat gesagt.:
Kann mir jmd eine vernünftige Erklärung dazu geben oder ist das ein Semantikfehler bei der Konstruktion von Java?
Es macht in diesem Zusammenhang keinen Unterschied. In jedem Fall ist klar, was gemeint ist. Warum also verschiedene Schlüsselworte?
 

Nogge

Mitglied
Ich habe nun dieses:
Code:
public List<? extends MyInterface> test() { ... }
Seltsam ist jetzt noch folgendes:
Code:
List<MyInterface> list = test();
Diese Zeile ist ungültig ?!? Auch mit einer Implementierung des MyInterfaces will mein Eclipse das nicht akzeptieren. Erst, wenn ich ein Cast mache, zeigt mir meine IDE "nur" noch eine Warnung an, dass es unsicherer Code sei.
 
G

Gelöschtes Mitglied 5909

Gast
weil du mit extends sagst dass du ein extendedes interface erwartest und nicht das interface selbst

<? extends Foo> --> du musst Foobar extends Foo nehmen
<Foo> --> du kannst Foo oder Foobar nehmen
 
S

SlaterB

Gast
es kann auch das Interface selber sein


Code:
        List<? extends Set> a = null;

        a = new ArrayList<? extends Set>(); // geht übrigens nicht
        a = new ArrayList<Set>(); // geht (1)
        List<HashSet> c = new ArrayList<HashSet>();
        a = c;// geht (2)


        List<Set> b = a; // wäre schlimm wenn das ginge

bei der Zuweisung zu b weiß der Compiler nicht, ob das Objekt unter a nun eine ArrayList<Set> ist oder z.B. eine ArrayList<HashSet>

Fall (1) wäre ok, bei Fall (2) wäre das aber fatal, in b könnte man nun auch ein TreeSet einfügen,
und ein get()-Aufruf bei der immer noch vorhandenen Variable c würde zu einer ClassCastException führen


in List a darf man aus ähnlichem Grund generell nichts einfügen, das verbietet der Compiler
 

Nogge

Mitglied
Oben hieß es, dass das ? auch für eine Implementierung gilt. Jetzt wieder nicht? Deswegen meine ich ja, dass es ziemlich verwirrend bzw. sogar falsch von Sun gestaltet wurde. Dann beschreibe ich mal meine Situation genau:
Ich habe einen Client, der auf mehrere Interfaces zugreifen kann. Ein Server implementiert diese Interfaces und stellt dem Client versch. Methoden zur Verfügung, die u.a. eine Liste von Interfaces zurückgeben. Ein Beispiel wäre dann die o.g. test()-Methode.
Der Client soll nur die Liste der Interfaces (nur mit get-Methoden, keine set-Methoden) sehen und benutzen, der Server soll eine Liste mit den konkreten Implementierungen (auch mit set-Methoden) sehen und benutzen können. Der Austausch zw. Client und Server soll dann über die Interfaces geschehen.
Mal ein Beispiel in nicht funktionierenden Code, aber die Idee sollte erkennbar sein:
Code:
[b]SERVER:[/b]
public class Ordering {

private List<Drink> drinks = new ArrayList<Drink>();

public void setCost(float cost, int i) {
		return drinks.get(i).setCost(cost);  // setCost() gibt's nicht im Interface IDrink, nur bei der konkreten Implementierung Drink
}

// für Client-Server-Kommunikation
public List<IDrink> getDrinks() {
		return drinks; // das geht leider nicht
	}
Code:
CLIENT:
List<IDrink> orderedDrinks = getDrinks();
 

Ebenius

Top Contributor
Es ist nicht falsch gestaltet. Es hat alles Gründe. Um diese zu verstehen, muss man sich damit eingehend beschäftigen. Also erstmal das ganze Tutorial lesen, siehe mein letzter Post. Wenn Du da durch bist, sollte klar sein, warum das Fragezeichen an der einen Stelle geht und an der anderen nicht. Und warum es kein Design-Bug ist.

BTW: Es hat auch Gründe, warum Sun die Generics nicht schon in 1.4 eingebaut haben. Das ganze Konzept steht schon lange, aber es ist nun mal naturbedingt kompliziert.
 
S

SlaterB

Gast
public List<? extends IDrink> getDrinks() {

wie schon geschrieben wurde (zweite Antwort)

+ beim Client
List<? extends IDrink> orderedDrinks = getDrinks();
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M OOP Design Pattern - "extends Observable implements Observer" Allgemeine Java-Themen 0
ruutaiokwu AVLTree implements SortedMap - hat jemand sowas? Allgemeine Java-Themen 3
C Kann Methode nicht aus Klassenname implements Runnable nutzen Allgemeine Java-Themen 7
G wieso "implements" Allgemeine Java-Themen 13
K ActionListener ohne implements? Allgemeine Java-Themen 2
B Leere vererbte Interface-Methoden Allgemeine Java-Themen 8
OnDemand Interface imlementieren Allgemeine Java-Themen 4
Buroto Interface Allgemeine Java-Themen 2
T Komische Zeichen im Zusammenhang mit Serializable interface Allgemeine Java-Themen 13
M Kann man Annotationen auf Klassen einschränken die ein Interface implementieren? Allgemeine Java-Themen 1
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
P Abstrakte Klassen vs. Interface Allgemeine Java-Themen 4
Kirby.exe Autocloseable Interface Allgemeine Java-Themen 2
T Abgeleitetes Interface public ohne Schlüsselwort "interface"? Allgemeine Java-Themen 3
S static in Interface und Klasse Allgemeine Java-Themen 2
S static methode im Interface Allgemeine Java-Themen 1
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
B Vererbung Interface und implementierende Klassen Allgemeine Java-Themen 8
A Anonyme Klassen - Interface Allgemeine Java-Themen 5
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
mrBrown Namensfindung Fluent-Interface Allgemeine Java-Themen 0
J Logik in Interface Allgemeine Java-Themen 2
N Best Practice Allgemeines Verhalten für ein Interface implementieren? Allgemeine Java-Themen 7
B eigenes Consumer Interface Allgemeine Java-Themen 0
S 2 methoden mit gleichen namen und ein Interface Allgemeine Java-Themen 9
N GUI Interface, swing Allgemeine Java-Themen 7
Thallius Konzeptproblem User-Interface Allgemeine Java-Themen 5
T Interface vs abstract Allgemeine Java-Themen 2
S Klassen Abstract, Interface und ein Chat Tool Allgemeine Java-Themen 1
I Interface Interface / Klasse - wieso Abstract? Allgemeine Java-Themen 13
D generische Interface und konkrete Methode Allgemeine Java-Themen 3
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
N Problem mit Generics und Interface Allgemeine Java-Themen 4
D Methode mit optionalen Parametern in Interface Allgemeine Java-Themen 3
T Interface mit generische Typen Allgemeine Java-Themen 5
M Interface einer Library implementieren Allgemeine Java-Themen 3
A Klassen ein Interface aufzwingen Allgemeine Java-Themen 4
Bananabert Interface Custom 'Event' mit Interface Allgemeine Java-Themen 10
J Interface Serializable Methodensignatur Allgemeine Java-Themen 2
J Interface Interface für Framework verwenden Allgemeine Java-Themen 4
F Interface IInterface oder Interface? Allgemeine Java-Themen 3
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
T Interface Probleme Allgemeine Java-Themen 8
M Queues und Queue Interface Allgemeine Java-Themen 3
I Mehrfaches Implementieren eines generischen Interface Allgemeine Java-Themen 9
W Java Native Interface und "mp3player" Allgemeine Java-Themen 3
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
P Eclipse Java Native Interface-Problem Allgemeine Java-Themen 8
Z Abstrakte Klassen /Interface Allgemeine Java-Themen 5
pg1337 Interface-Frage Allgemeine Java-Themen 24
S Interface Welchen Interface Stil favorisiert ihr? (usability) Allgemeine Java-Themen 17
faetzminator statische Variablen in Interface - Vererbung? Allgemeine Java-Themen 9
R Implementierung eines Interface durch 2 verschiedene Klassen Allgemeine Java-Themen 6
T OpenOffice Interface Elemente Ein/Ausblenden Allgemeine Java-Themen 5
K Interface Interface comparable machen Allgemeine Java-Themen 9
T Interface > Abstract > Class Allgemeine Java-Themen 11
N Trick für Compilerfehler bei fehlendem Interface Allgemeine Java-Themen 12
X Interface - Klasse einladen Allgemeine Java-Themen 6
G Interface -> InterfaceImplementierung Allgemeine Java-Themen 3
Ark Array durch Interface ersetzen Allgemeine Java-Themen 7
R Interface instanzieren Allgemeine Java-Themen 8
B Frage zu Interface und List Allgemeine Java-Themen 4
KrokoDiehl JNI: native im Interface Allgemeine Java-Themen 4
S normale vererbung als interface Allgemeine Java-Themen 2
E Beispiel für ein möglichst einfaches Interface Allgemeine Java-Themen 22
N Unterschied abstract interface und interface Allgemeine Java-Themen 4
S interface verbung problem Allgemeine Java-Themen 9
S problem programm mit interface: Allgemeine Java-Themen 3
R Vererbung mit Interface und Abstract Allgemeine Java-Themen 3
B Interface und von Thread ableiten Allgemeine Java-Themen 6
R Interface Serializable technische Begrenzung Allgemeine Java-Themen 2
T Interface-Referenz Allgemeine Java-Themen 2
L interface abstrakte klasse Allgemeine Java-Themen 21
S Interface Geschäftslokik & GUI Allgemeine Java-Themen 6
G Interface zwischen 2 Programmierern Allgemeine Java-Themen 10
C Schnittstellen(interface) Allgemeine Java-Themen 9
D javadoc interface + implementation + @overrides Allgemeine Java-Themen 16
G Interface oder abstrakte Klasse Allgemeine Java-Themen 4
T Parameter einer Klasse auf Interface prüfen Allgemeine Java-Themen 6
A feststellen, welche Klassen ein Interface implementieren Allgemeine Java-Themen 3
G class, interface, or enum exp? Allgemeine Java-Themen 2
S Interface Klasse überladen. Allgemeine Java-Themen 2
K Inneres Interface äußere Klasse Allgemeine Java-Themen 7
T Frage zu interface und "guter Programmierstil" Allgemeine Java-Themen 4
T Interface "on-the-fly" implementieren? Allgemeine Java-Themen 3
S Frage zu Interface Allgemeine Java-Themen 7
J Objektorientiert - Interface & Klassen Allgemeine Java-Themen 3
G Interface - Klassen implementieren das - Reflection ok? Allgemeine Java-Themen 4
T "Programming against the interface" sinnvoll? Allgemeine Java-Themen 18
G Interface mehrfach implementieren Allgemeine Java-Themen 5
@ zur Laufzeit Interface aus jar implementieren? Allgemeine Java-Themen 5
A Was ist der genau Sinn eines Interface? Allgemeine Java-Themen 13
E Oberbergriff für class und interface Allgemeine Java-Themen 20
D QuickSort, Interface Allgemeine Java-Themen 2
R Interface für Arithmethik? Allgemeine Java-Themen 3
MQue Interface implementieren Allgemeine Java-Themen 7
P Liste von Klassen die ein Interface implementieren speichern Allgemeine Java-Themen 12

Ähnliche Java Themen

Neue Themen


Oben