interface / generics

Status
Nicht offen für weitere Antworten.

Avantarius

Mitglied
Muss für die Uni einige Java Klassen und Interfaces schreiben. Soweit ich die Angabe verstanden habe soll das Interface so werden dass folgendes zutrifft:

Java:
public class X implements MyInterface {

	public X myMethode(X parameter) {
		...
	}

}

d.h. das Interface soll sicherstellen dass eine davon abgeleitete Klasse X eine Methode myMethode enthält, die als parameter und Rückgabewert denselben Datentyp wie die Klasse selbst (bzw. eine Unterklasse derselben) hat. Mein erster Ansatz ist:

Java:
public interface MyInterface {
	public <X> X myMethode(X parameter);
}

Dadurch ist allerdings nicht sichergestellt dass X dann denselben Typ hat wie die Klasse!? Bitte um Hilfe!
 

Noctarius

Top Contributor
Java:
public interface IFoo<T extends IFoo> {
  public T myMethod(T parameter);
}

public class Foo implements IFoo<Foo>  {
  public Foo myMethod(Foo parameter);
}
 

Avantarius

Mitglied
Wow, das ging ja fix! Vielen Dank :-D

Ach ja, Danke dass ihr in eurem Beispiel foo verwendet habt, von bar werde ich immer so nervös ;-)
 

Der Müde Joe

Top Contributor
Könnte man auch ohne Generics:
Java:
interface Foo {
Foo getFoo();
}

return-Wert ist immer ein Foo
 
Zuletzt bearbeitet:

Avantarius

Mitglied
Java:
public interface IFoo<T extends IFoo> {
  public T myMethod(T parameter);
}

public class Foo implements IFoo<Foo>  {
  public Foo myMethod(Foo parameter);
}

Habs gerade ausprobiert, offenbar kann man in Foo.myMethod auch das "Foo" durch z.B. "Integer" ersetzen und compiliert trotzdem wunderbar?
 

faetzminator

Gesperrter Benutzer
Also bei mir funktioniert das wunderbar... Ich würd allerdings [c]interface IFoo<T extends IFoo<T>>[/c] schreiben :D
 

Avantarius

Mitglied
Hm, mein Fehler. Offenstichtlich wird das ganze nicht geprüft wenn die Klasse abstract ist. Werd mal was nicht abstraktes ableiten und schaun was passiert, hehe!
 

Der Müde Joe

Top Contributor
Du kannst damit nur mit Klassen Parametrisieren, welche von IFoo erben. Daher auch die Upper Bound (T extends IFoo).
Integer also nicht, erbt ja nicht von IFoo.

EDIT:
Beispiel:
Java:
public interface IFoo<T extends IFoo<? super T>> {
  public T myMethod(T parameter);
}
 
//klappt
class Foo implements IFoo<Foo>  {
  public Foo myMethod(Foo parameter){return null;}
}
// nix gut: Integer implementiert nicht IFoo
class BadIdea implements IFoo<Integer> {
	public Integer myMethod(Integer parameter){return null;}
}
 
Zuletzt bearbeitet:

Avantarius

Mitglied
Hab jetzt folgendes Programmiert und leider noch ein Problem:

Java:
public abstract class Component implements IFoo<Component> {
  ...
}

public class Device extends Component {
  ...
}

public class Tree<A> {
  ...
}

public class AccTree<A extends IFoo<? super A>> extends Tree<A> 
	implements IFoo<AccTree<A>> {
  ...
}

D.h. Klasse AccTree soll als Typ nur von IFoo geerbte Klassen akzeptieren, und auch selbst IFoo implementieren. Allerdings habe ich jetzt das Problem, dass ich folgendes nicht machen kann:

Java:
AccTree<Device> x = new AccTree<Device>(new Device(10, 5));
AccTree<Component> y = x; //Fehler

Es funktioniert nicht, obwohl Device ja von Component erbt. Bitte um Hilfe!
 

Marco13

Top Contributor
AccTree<? extends Component> y = x; // Könnte gehen
Wobei ich zugeben muss, mich da auch nach Jahren noch (oder nach Jahren schon?!) auf den Compiler verlasse... :oops:
 

Avantarius

Mitglied
Ja, so funktioniert das Zuweisen. Allerdings habe ich noch folgendes Problem: Ich habe außer 'Device' auch eine Klasse 'Job' die ebenfalls von 'Component' erbt.

Nun soll ich einen AccTree<Device> und einen AccTree<Job> erzeugen. Diese soll ich dann an zwei AccTree<Component> zuweisen, und schließlich den einen Baum in den anderen einhängen, was mit der Methode 'myMethod' aus 'IFoo' passieren soll:

Java:
public class AccTree<A extends IFoo<? super A>> extends Tree<A> 
	implements IFoo<AccTree<A>> {
	
public AccTree<A> myMethod(AccTree<A> parameter) {
		parameter.setParent(this);
		return this;
	}

  ...
}

Ich muss also dem Compiler beibringen, dass AccTree<Von_X_geerbt> "kompatibel" zu AccTree<X> ist... nur wie?
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ja, was heißt "kompatibel"... So wie ich das verstehe (!): Es geht nicht. Die Begründung an einem Beispiel das etwas leichter nachzuvollziehen ist, als "<A extends IFoo<? super A>> extends Tree<A>":
Java:
class Hund {}
class Dackel extends Hund {}
class Beagle extends Hund {}

Dackel dackel = new Dackel();
Beagle beagle = new Beagle();
Hund irgendeinHund = beagle;

List<Hund> hundeListe = new ArrayList<Hund>();
hundeListe.add(dackel); // Passt, jeder Dackel ist ein Hund

List<Dackel> dackelListe = new ArrayList<Dackel>();
dackelListe.add(dackel); // Passt auch

// Passt: Die dackelListe ist eine Liste von "irgendwelchen Hunden"
List<? extends Hund> irgendwelcheHundeListe = dackelListe; 

// Passt: Da ist irgendein Hund drin
Hund hund = irgendwelcheHundeListe.get(0);

// Passt NICHT: Es sind zwar "irgendwelche Hunde" in der Liste,
// aber man weiß nicht, ob es Dackel sind oder andere...
irgendwelcheHundeListe.add(irgendeinHund);

Solange du keinen vollständige(re)n Quellcode postest, kann man kaum etwas sagen, was hinausgeht über: "Füge überall '? extends' ein, bis es passt" ... :oops:
 

Avantarius

Mitglied
Hm, jetzt wird mir einiges klar. Vielleicht habe ich auch einfach die Angabe falsch interpretiert. Ein
Java:
AccTree<Component> x = new AccTree<Component>(new Device(10, 5));

sollte den Job erledigen.
Vielen Dank!
 

Marco13

Top Contributor
Wenn du noch Zweifel hast, poste (und beschreibe) am besten mal ein KSKB, wo nur der relevante Compilerfehler auftritt - vielleicht gibt es auch eine allgemeinere oder bessere Lösung.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
I No Jakarta Enterprise Beans found with interface ignorieren? Java Basics - Anfänger-Themen 2
I No EJB found with interface of type Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
Say Abstrakt oder Interface Java Basics - Anfänger-Themen 3
Say public/default Interface Java Basics - Anfänger-Themen 9
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
I Browser integriert in Desktop Applikation - Webcam interface not found Java Basics - Anfänger-Themen 26
U Beispiel Methode size() vom "Collection"-interface... Wie kann man sichtbar machen, was die Methode unter der Haube macht? Java Basics - Anfänger-Themen 8
J Interface Comparable<T> Java Basics - Anfänger-Themen 10
M Interface oder Vererbung? Java Basics - Anfänger-Themen 12
D Interface Verständisfrage Java Basics - Anfänger-Themen 8
U Interface | constructor injection Java Basics - Anfänger-Themen 5
J Interface Interface korrekt implementieren Java Basics - Anfänger-Themen 5
A Methoden Vererbung und Interface Java Basics - Anfänger-Themen 14
T Interface Map und Map.Entry Java Basics - Anfänger-Themen 4
U Interface als PAramter (Vergleich) und ein Error Java Basics - Anfänger-Themen 9
I Interface von einer EJB Klasse, um Code zu reduzieren Java Basics - Anfänger-Themen 1
M Interface als Parameter einer Klasse Java Basics - Anfänger-Themen 8
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
I JSON und Interface Java Basics - Anfänger-Themen 3
Kotelettklopfer Kleines Testprogramm mit Interface und einer Usereingabe Java Basics - Anfänger-Themen 16
J Interface methode aufrufen (interface parameter) Java Basics - Anfänger-Themen 7
CptK Interface Functional interface mit mehreren Methoden Java Basics - Anfänger-Themen 6
L Interface & Comparable Java Basics - Anfänger-Themen 15
T Interface Java Basics - Anfänger-Themen 0
B Interface List - Objekt übergeben? Einzelnes Objekt geht, aber Liste nicht? Java Basics - Anfänger-Themen 4
B Best Practice Unschlüssig ob Vererbung oder Interface Java Basics - Anfänger-Themen 2
E abstrakte Klasse implementiert ein Interface Java Basics - Anfänger-Themen 40
C Interface und Konstruktor Java Basics - Anfänger-Themen 1
S Interface Equals und hashCode Java Basics - Anfänger-Themen 16
A Generische Klassen/Interface Java Basics - Anfänger-Themen 1
C Methoden-Parameter ist Interface Java Basics - Anfänger-Themen 5
B Collections Objektreferenz-ID in der Ausgabe (Comparator Interface) Java Basics - Anfänger-Themen 2
A Interface Kuddelmuddel Java Basics - Anfänger-Themen 4
C Collections List über Interface zugreifen Java Basics - Anfänger-Themen 32
S Interface Interface und seine Implementierung Java Basics - Anfänger-Themen 5
H abstract und interface Java Basics - Anfänger-Themen 4
F Interface Casting Java Basics - Anfänger-Themen 13
C Telefonliste mit interface implementieren Java Basics - Anfänger-Themen 30
L Klassen Kann eine Unterklasse einer abstrakten Klasse ein Interface implementieren? Java Basics - Anfänger-Themen 2
H Interface Java Basics - Anfänger-Themen 2
R Quicksort mit Interface Comparable Java Basics - Anfänger-Themen 6
T Interface Methode im Interface mit mehreren Parametern Java Basics - Anfänger-Themen 10
B Interface vs Abstract Java Basics - Anfänger-Themen 2
B Objekte zählen/ Vererbung/ Kopplung/ Interface/ Abstract Class Java Basics - Anfänger-Themen 5
pkm Interface Funktionales Interface lässt sich nicht implementieren. Java Basics - Anfänger-Themen 2
Kornblume Comparable Interface für Objektvergleiche nutzen Java Basics - Anfänger-Themen 15
I Comparator<T> Interface als Methodenparamter Java Basics - Anfänger-Themen 4
J OOP Wie sollte ich das organisieren (Abstract? Interface?) Java Basics - Anfänger-Themen 33
J Java Interface/abstrakte Klassen Java Basics - Anfänger-Themen 2
E Interface nur von abstrakter Klasse implementierbar?! Java Basics - Anfänger-Themen 1
J Vererbung Abstrake Klasse <-> Interface Java Basics - Anfänger-Themen 5
C Interface als Datentyp eines Attributes? Java Basics - Anfänger-Themen 6
U Interface Bedeutung "Code to an interface rather than to an implementation." Java Basics - Anfänger-Themen 4
M Erste Schritte Prüfungsbeispiel: Interface / abstrakte Klassen Java Basics - Anfänger-Themen 8
M Maven Main-Methode Interface und Klasse Java Basics - Anfänger-Themen 2
R Interface Eigene Objekte in Listen sortieren mit Interface Comparable Java Basics - Anfänger-Themen 5
D Interface Amazon Skill Kit, Interface but method in other class? Java Basics - Anfänger-Themen 3
A Interface Abstrakte Interface Methode kann nicht benutzt werden Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
T Vererbung und interface. Java Basics - Anfänger-Themen 1
N Interface Interface Erstellung Java Basics - Anfänger-Themen 3
kilopack15 Beziehung Interface - (abstrakte) Klasse -Unterklasse Java Basics - Anfänger-Themen 3
C Interface Fragen zum Interface Java Basics - Anfänger-Themen 7
Azazel Ist die abstract class das selbe wie ein interface ? Java Basics - Anfänger-Themen 33
K Interface: wie damit arbeiten Java Basics - Anfänger-Themen 4
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
T Vererbung Interface Java Basics - Anfänger-Themen 5
F Interface aus anderem Package nutzen Java Basics - Anfänger-Themen 10
N Interface Daten einem Implementierten Interface zuweisen Java Basics - Anfänger-Themen 37
B Erste Schritte Wie definiere ich in Java ein Interface? Java Basics - Anfänger-Themen 6
L OOP Interface Prinzip? Java Basics - Anfänger-Themen 6
K Nutzung einer Klasse die das Iterator-Interface implementiert Java Basics - Anfänger-Themen 0
K Iterator-Interface implementieren mit Exception Handlung Java Basics - Anfänger-Themen 1
J Innerhalb Interfacemethode: Interface als Attribut Java Basics - Anfänger-Themen 2
A Frage zu Interface Java Basics - Anfänger-Themen 16
J Interface Java Basics - Anfänger-Themen 3
W Interface Java Basics - Anfänger-Themen 1
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
G Interface java.util.Comparator: Wieso muss nur die Methode compare() implementiert werden Java Basics - Anfänger-Themen 2
Shams Kann man von einem Interface aus auf die dieses implementierende Klasse zugreifen? Java Basics - Anfänger-Themen 4
S Generische Methode soll Objekte als Parameter erlauben die bestimmtes Interface implementieren^ Java Basics - Anfänger-Themen 9
J Frage zu dem Thema interface Java Basics - Anfänger-Themen 5
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
S Interface-Methode abrufen? Java Basics - Anfänger-Themen 2
G Vererbung Klasse erbt von abstrakter Klasse implementiert Interface Java Basics - Anfänger-Themen 2
M Konstanten in einem Interface definieren Java Basics - Anfänger-Themen 1
P interface Java Basics - Anfänger-Themen 1
F eigenes Listener Pattern mit Interface Java Basics - Anfänger-Themen 1
M Interface als Datentyp Java Basics - Anfänger-Themen 12
K Interface Methoden überschreiben Java Basics - Anfänger-Themen 1
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
A Interface in Collection (Liste) angeben Java Basics - Anfänger-Themen 2
G Interface klasse Java Basics - Anfänger-Themen 4

Ähnliche Java Themen


Oben