Generics Vererbung Wildcard Interface

ninonino

Mitglied
Ich verstehe nicht warum ich in folgendem Beispiel in der ClassCollectionString-KLasse in der addList Methode nicht <ClassChild> für <? extends Class<String>> einsetzen kann ?
Java:
	abstract class Class<T>{
		
	}
	class ClassChild extends Class<String>{
		
	}
	interface ClassCollection<T>{
		void addList(ArrayList<? extends Class<T>>list);
		
	}
das geht :
Java:
	class ClassCollectionString implements ClassCollection<String>{

		@Override
		public void addList(ArrayList<? extends Class<String>> list) {
			// TODO Auto-generated method stub
			
		}
	}
das nicht :
Java:
	class ClassCollectionString implements ClassCollection<String>{

		@Override
		public void addList(ArrayList<ClassChild> list) {//<-----------------FEHLER
			// TODO Auto-generated method stub
			
		}
	}
Eclipse : ClassCollectionString must implement the inherited abstract method ClassCollection<String>.addList(ArrayList<? extends Class<String>>)
 
Zuletzt bearbeitet:

Lodoss

Aktives Mitglied
Ich habe mal dein sehr abstraktes Beispiel ein bisschen blumiger gemacht

Java:
	abstract class Haus<T>
	{
		 
	}
	
	class StringHaus extends Haus<String>
	{
	 
	}
	
	interface Strasse<T>
	{
		void addList(ArrayList<? extends Haus<T>>list);
	 
	}
	
	class ClassCollectionString implements Strasse<String>
	{
		 
		@Override
		public void addList(ArrayList<StringHaus> list) //<-----------------FEHLER
		{
			// TODO Auto-generated method stub
		}
	}

ich kämpfe grade noch ein wenig mit der Erklärung, warum das ganze nicht funktioniert wie du das möchtest. hier der code mit dem deine methoden-signatur korrekt ist:

Java:
	class StringHaus extends Haus<String>
	{
	 
	}
	
	interface Strasse<T>
	{
		void addList(ArrayList<T>list);
	 
	}
	
	class ClassCollectionString implements Strasse<StringHaus>
	{
		 
		@Override
		public void addList(ArrayList<StringHaus> list)
		{
			// TODO Auto-generated method stub
		}
	}

Edit::

problem ist folgendes: du definierst über dein interface ClassCollection, dass man als parameter für addList etwas vom typ ArrayList<? extends Class<T>> übergeben muss

wenn ich also bei ClassCollectionString<String> addList aufrufe, dann würde ich erwarten, das er alles entgegennimmt was eine ArrayList ist, dessen generic vom typ Class<String> ist

das kann z.B. ArrayList<ClassChild> sein, aber z.B. auch ArrayList<MySuperDuperClass extends Class<Anything extends String>> sein

wenn du also in ClassCollectionString.addList den typ ArrayList<ClassChild> als parameter erwartest erfüllst du nicht die anforderungen an das interface, weil dein typ andere mögliche kompatible typen ausschließt die eigentlich valide wären.


Edit2:

das schöne ist, du solltest so auch schon folgendes machen können:

Java:
ClassCollectionString<String> list = new ClassCollectionString<String>();
 // komplexer typ, der aber deinem interface gerecht wird
ArrayList<ClassChild> advancedChilds = new ArrayList<ClassChild>();
 // komplexer typ, den wir aber in eine allgemeinere liste packen, die aber auch dem interface gerecht wird
ArrayList<Class<String>> hiddenTypeChilds = new ArrayList<ClassChild>();
list.addList(advancedChilds);
list.addList(hiddenTypeChilds);
(ist im browser geschrieben, habs grad mal nicht in der IDE ausprobiert, sollte aber gehen)
 
Zuletzt bearbeitet:

ninonino

Mitglied
Hey , vielen Dank schonmal !
Da kommen ein paar Fehlermeldungen.
Code:
	ClassCollectionString<String> list = new ClassCollectionString<String>();
//	ClassCollectionString is not generic; it cannot be parameterized with arguments <String>//	
	// komplexer typ, der aber deinem interface gerecht wird
	ArrayList<ClassChild> advancedChilds = new ArrayList<ClassChild>();
	// komplexer typ, den wir aber in eine allgemeinere liste packen, die aber auch dem interface gerecht wird
	ArrayList<Class<String>> hiddenTypeChilds = new ArrayList<ClassChild>();
//	Type mismatch: cannot convert from ArrayList<ClassChild> to ArrayList<Class<String>>
	list.addList(advancedChilds);
	list.addList(hiddenTypeChilds);
Habe die Funktion von Interfaces wohl noch nicht verstanden.
Gibt es denn eine Möglichkeit eine Methode mit generischem Parameter vorzuschreiben und diesen Parameter dann bei der implementierenden Klasse konkret zuzuweisen ?
 
Zuletzt bearbeitet:

Lodoss

Aktives Mitglied
Habe die Funktion von Interfaces wohl noch nicht verstanden.

zum thema Interface

Ein Interface bietet die möglichkeit, anzugeben das ein object einer klasse gewisse eigenschaften hat. Die idee dahinter ist folgende: ich habe mehrere verschiedene klassen die alle eine eigenschaft teilen. nun schreibe ich eine klasse die genau diese und nur diese eigenschaft benötigt. damit ich jetzt nicht für jede meiner verschiedenen klassen eine extra methode schreiben muss, kann ich eine schreiben die etwas vom typ des interface entgegennimmt.

Beispiel:
Java:
interface HatBeine
{
   int getBeine();
}

class Stuhl implements HatBeine
{
    // interface method
    int getBeine()
    {
         return 4;
    }

    // ....
}

class Tisch implements HatBeine
{
    // interface method
    int getBeine()
    {
         return 2;
    }

    // .....
}

class MoebelBeineZaehler
{
    public static getSummeBeine(List<HatBeine> liste)
    {
         int summe = 0;
         for (HatBeine b : liste)
        {
             summe = summe + b.getBeine();
        }
        return summe;
    }
}

ArrayList<HatBeine> moebelmitbeinen = new ArrayList<HatBeine>;
moebelmitbeinen.add(new Stuhl());
moebelmitbeinen.add(new Stuhl());
moebelmitbeinen.add(new Tisch());
MoebelBeineZaehler.getSummeBeine(moebelmitbeinen); // return ist 10
Erleuterung: Sowohl Tische, als auch Stühle haben Beine, damit ich jetzt nicht für beide in der Klasse MoebelBeineZaehler eine eigene Methode schreiben muss, bekommen beide Klassen das interface "HatBeine" in der die Funktion getBeine() definiert ist, die von getSummeBeine(...) genutzt wird.

edit: und richtig cool daran ist, dass ich jetzt auch einfach eine neue Klasse "Mensch implements HatBeine" machen kann und schwupp kann MoebelBeineZaehler.getSummeBeine(...) auch die automatisch mitzählen


Gibt es denn eine Möglichkeit eine Methode mit generischem Parameter vorzuschreiben und diesen Parameter dann bei der implementierenden Klasse konkret zuzuweisen ?

da stellt sich die Frage, warum du dann überhaupt einen generischen Typ brauchst, wenn du sowieso konkret zuweisen willst? Da kannst du den generic genausogut einfach weglassen.
Generics dienen dazu, einer Klasse beizubringen, dass ihr der typ eigentlich egal sein kann

Bspw. ist einer Liste eigentlich egal, ob da String, Object, Integer oder sonstwas drin sind denn das hat keinen Einfluss darauf, wie eine Liste funktioniert.
 
Zuletzt bearbeitet:

ninonino

Mitglied
habs jetzt so gelöst :
Java:
	abstract class Class<T>{
		
	}
	class ClassChildWithString extends Class<String>{
		
	}
	interface ClassCollection<T,F extends Class<T>>{
		
		void doSomething(T t);
		
		void addList(ArrayList<F> list);
		
	}
	class ClassCollectionString implements ClassCollection<String,ClassChildWithString>{

		@Override
		public void doSomething(String t) {
			// TODO Auto-generated method stub
			
		}

		@Override
		public void addList(ArrayList<ClassChildWithString> list) {
			// TODO Auto-generated method stub
			
		}

	}
mich stört dabei :
interface ClassCollection<T,F extends Class<T>>
da F von T abhängt scheint es mir an dieser Stelle unschön...???
 

Lodoss

Aktives Mitglied
da F von T abhängt scheint es mir an dieser Stelle unschön...???
aber genau das ist doch, was du hier erzwingen willst oder etwa nicht? die abhängigkeit ist sowieso dadurch gegeben das ClassChildWithString<F> von Class<T> erbt
 
Zuletzt bearbeitet:

ninonino

Mitglied
Ich habe hinterher NutzerKlassen welche bestimmte Methoden nutzen müssen welche das Interface bereitstellt.
Was innerhalb der der Spezialisierenden Klassen passiert hängt halt von T ab.
Nach aussen sollen sie aber da sie auf ähnlich aufgebauten UI - Elementen abgebildet werden sollen die (fast) gleiche Funktionalität anbieten.
Den Speicherklassen is nicht egal was für Elemente sie enthalten,da sich teilweise ganz andere Regeln durch die Art der enthaltenen Objekte ergeben.
In meinem Fall wäre es wohl einfacher gewesen die SpezialKlassen komplett unabhängig zu schreiben , allerdings hätte ich dann einigen Code doppelt und dreifach,was ich gerne vermeiden möchte !
 

Lodoss

Aktives Mitglied
Nach aussen sollen sie aber da sie auf ähnlich aufgebauten UI - Elementen abgebildet werden sollen die (fast) gleiche Funktionalität anbieten.

dann wäre der (aus meiner sicht) klügste ansatz, ein Interface für die UI Elemente zu entwerfen und dann deinen Objekten zusätzlich die Methoden für die jeweiligen Nutzerklassen beizubringen. das (fast) musst du dann natürlich irgendwie vereinheitlichen.

um doppelten code zu verringern kannst du für deine Objekte weitere interfaces erzeugen und abstrakte basisklassen für deine Objekte bereitstellen (quasi eine "Default"-variante wo das wesentliche gemeinsame drin ist)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
L Generics und vererbung Java Basics - Anfänger-Themen 3
M Generics und Vererbung Java Basics - Anfänger-Themen 4
H Generics machen mich verrückt Java Basics - Anfänger-Themen 8
John_Sace Homogene Realisierung von Generics in Java ? Java Basics - Anfänger-Themen 19
MarvinsDepression Datentypen Generics: Erste Berührungen Java Basics - Anfänger-Themen 6
Cassy3 Generics - CompareTo Java Basics - Anfänger-Themen 21
T Collections Sind Subklassen-Objekte in Listen mit Generics erlaubt? Java Basics - Anfänger-Themen 16
districon Generics implementieren Java Basics - Anfänger-Themen 2
CptK Überprüfen ob übergebenes Objekt zu Generics passt Java Basics - Anfänger-Themen 2
CptK Generics: Klassen die Interface implementieren, aber selbst nicht das Interface sind Java Basics - Anfänger-Themen 8
B Hilfe bei Generics Java Basics - Anfänger-Themen 11
G Generics Compilerfehler Java Basics - Anfänger-Themen 6
G Generics Methoden Java Basics - Anfänger-Themen 7
G Generics Java Basics - Anfänger-Themen 3
L Generics Tripel Java Basics - Anfänger-Themen 26
W Fragen zu Generics Java Basics - Anfänger-Themen 14
S Hilfe. Generics und BiFunctions Java Basics - Anfänger-Themen 10
X Wie Generics richtig benutzen ? Java Basics - Anfänger-Themen 5
S Allgemeine Frage über Generics und Vererbungen Java Basics - Anfänger-Themen 5
S Generics-Problem: Class, Class<?>, Class<Object> Java Basics - Anfänger-Themen 4
I Java Generics factory method Java Basics - Anfänger-Themen 2
M Verständnisfrage zu Generics Java Basics - Anfänger-Themen 7
I Generics und Comparable Java Basics - Anfänger-Themen 14
G Generics mit ? und Diamantoperator Java Basics - Anfänger-Themen 4
G Generics: Wildcard ? Java Basics - Anfänger-Themen 12
D Generics methode Java Basics - Anfänger-Themen 2
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
W Generics - Typ zurückbekommen Java Basics - Anfänger-Themen 4
Dimax Erste Schritte Generics von Profis leicht erklärt Java Basics - Anfänger-Themen 7
C Warum funktioniert 'instanceof' bei generics nicht? Java Basics - Anfänger-Themen 4
J Collections Generics: Typ wird nicht erkannt Java Basics - Anfänger-Themen 7
D Generics ArrayList: Bug im Quellcode Java Basics - Anfänger-Themen 14
C Generics Java Basics - Anfänger-Themen 8
M Generics getter und setter Methoden Java Basics - Anfänger-Themen 4
T Generics in Java... Java Basics - Anfänger-Themen 9
J Generics Java Basics - Anfänger-Themen 3
J Generics Datentypen vergleichen Java Basics - Anfänger-Themen 16
V Generics / eigene Liste Java Basics - Anfänger-Themen 4
O Generics - Implementierung Java Basics - Anfänger-Themen 7
Shizmo Frage zu Generics Java Basics - Anfänger-Themen 3
F Multiple Generics Java Basics - Anfänger-Themen 10
G Datentypen verschiedene Objekte in eine ArrayList, Generics Java Basics - Anfänger-Themen 2
H Typsicherheit/Generics Java Basics - Anfänger-Themen 1
U Java generics funktioniert nicht Java Basics - Anfänger-Themen 0
Tarrew Generics: Erste gemeinse Oberklasse als Rückgabewert Java Basics - Anfänger-Themen 1
S Generics und Comparable Interface Java Basics - Anfänger-Themen 5
A Generics Java Basics - Anfänger-Themen 4
M Frage zu Generics in Klassen, Abstrakten Klassen und Interfaces Java Basics - Anfänger-Themen 5
R Compiler-Fehler Generics Problem Java Basics - Anfänger-Themen 2
K Interface Generics, Interfaces und Listen - ich bin verwirrt. Java Basics - Anfänger-Themen 7
K Generics bei Klassen- und Interfacedeklarationen Java Basics - Anfänger-Themen 3
D toArray und Generics Java Basics - Anfänger-Themen 2
D Zwei Generics beim Überladen von Methoden Java Basics - Anfänger-Themen 3
C Erste Schritte Filter für Generics oder ähnliches Java Basics - Anfänger-Themen 2
M Frage zu Generics-Deklaration Java Basics - Anfänger-Themen 5
S Frage zu Collection-Generics in Subklassen Java Basics - Anfänger-Themen 6
J Java Generics - Frage zu Types Java Basics - Anfänger-Themen 2
M <T> Generics Java Basics - Anfänger-Themen 7
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
T Polymorphie Generics-Problem Java Basics - Anfänger-Themen 2
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Array Generics Java Basics - Anfänger-Themen 3
J Generics casten Java Basics - Anfänger-Themen 14
J Generics wildcard Java Basics - Anfänger-Themen 6
E Listen und Generics Java Basics - Anfänger-Themen 9
X Generics Java Basics - Anfänger-Themen 6
M Datei einlesen mit generics? Java Basics - Anfänger-Themen 9
D Warum sind Generics mit Vorsicht zu genießen? Java Basics - Anfänger-Themen 6
M OOP Mit Generics auf Methoden zugreifen? Java Basics - Anfänger-Themen 10
S Generics Java Basics - Anfänger-Themen 4
G Generics kein Zugriff auf getter eines Objekts Java Basics - Anfänger-Themen 4
L Datentypen Problem mit Generics und null Java Basics - Anfänger-Themen 6
E Klassen java.util.ArrayList<E> als Generics Java Basics - Anfänger-Themen 16
W Interface Problem mit Generics Java Basics - Anfänger-Themen 2
M OOP Generics und Wildcards Java Basics - Anfänger-Themen 3
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
C Generics Array Java Basics - Anfänger-Themen 43
D Fehler mit generics Java Basics - Anfänger-Themen 10
S Generics - CaseInsensitiveMap selber schreiben? Java Basics - Anfänger-Themen 5
K Datentypen Generics Java Basics - Anfänger-Themen 3
P Comparable und Generics Java Basics - Anfänger-Themen 6
I Generics (Subtypen) Java Basics - Anfänger-Themen 17
N Typeinschränkung bei Generics Java Basics - Anfänger-Themen 13
C Generics und Cast Java Basics - Anfänger-Themen 5
H Generics werden in -source 1.2 nicht unterstützt Java Basics - Anfänger-Themen 16
M Datentypen Generics: Exacten Typ ermitteln Java Basics - Anfänger-Themen 6
N Generics und Interfaces Java Basics - Anfänger-Themen 5
S Generics und "generische Feldzuweisungen" Java Basics - Anfänger-Themen 5
lumo Java Generics Java Basics - Anfänger-Themen 19
M verlinkte Liste mit generics Java Basics - Anfänger-Themen 7
capgeti Datentypen Static methoden aus Superklasse mit Generics definieren? Java Basics - Anfänger-Themen 9
S Generics und Typerkennung Java Basics - Anfänger-Themen 7
A Cast ohne Warnung bei Generics Java Basics - Anfänger-Themen 2
B Java Listen und Generics Java Basics - Anfänger-Themen 35

Ähnliche Java Themen

Neue Themen


Oben