OOP Generics und Wildcards

membersound

Bekanntes Mitglied
Hallo,

bitte nicht über die (un)sinnigkeit des Codes wundern, habe versucht mein Problem soweit es geht zu reduzieren als Beispiel.


Die vererbte Klasse unterscheidet sich in einigen Membervariablen und zugehörigen getter+setter.
In einer Modellklasse erzeuge ich mehrere Objekte. Da ich jeden Typ getrennt brauche, sammel ich sie in zwei verschiedenen ArrayListen.

Wenn ich diese beiden ArrayListen nun ausgeben will, weiß ich aber nicht wie ich die Vererbung nutzen kann. Da printList(...) so wie in meinem Beispiel geschrieben ja verschiedene Datentypen erwartet.

Geht das nicht anders, oder kann man das doch noch so umschreiben, dass die Vererbung auch was vereinfacht?
Code:
public class NoteClass {


	private int a;

	public NoteClass(int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}

	static void printList(ArrayList<NoteClass> myList) {
		int sizeOfList = myList.size();
        	for (int i = 0; i < sizeOfList; i++) {
            		Note tmp = myList.get(i) 
			System.out.println(tmp.getA());
		}
	}
	
}

Code:
public class TaskClass extends NoteClass {

	private String b;

	public TaskClass(int a, String b) {
		super(a);
		this.b = b;
	}

	public String getB() {
		return b;
	}

	static void printList(ArrayList<TaskClass> myList) {
		int sizeOfList = myList.size();
        	for (int i = 0; i < sizeOfList; i++) {
            		Task tmp = myList.get(i) 
			System.out.println(tmp.getA() + tmp.getB());
		}
	}
	
}

Code:
public class MyModel {

	public MyModel() {

	ArrayList<NoteClass> myNoteList = new ArrayList<NoteClass>();
	ArrayList<TaskClass> myTaskList = new ArrayList<TaskClass>();

	NoteClass myNote = new NoteClass (1);
	TaskClass myTask = new TaskClass (2, "hallo");

	myNoteList.add(myNote);
	myTaskList.add(myTask);	

	NoteClass.printList(myNoteList);
	TaskClass.printList(myTaskList);
	}
}

Danke
 
Zuletzt bearbeitet:

Antoras

Top Contributor
Wenn du unterschiedliche Typen hast, dann hast du unterschiedliche Typen. Versuche nicht auf Biegen und Brechen einen gemeinsamen Obertyp zu finden.

Dein Codebeispiel hat mehrere Probleme. Ich möchte aber nicht auf alle eingehen, so lange ich nicht weiß was du mit dem Code genau bewirken möchtest.

Um Spezialisierungen in Unterklassen zu erreichen kannst du parametrisierte Typen benutzen:
Java:
class MyModel {

	public MyModel() {

		final ArrayList<NoteClass> myNoteList = new ArrayList<NoteClass>();
		final ArrayList<TaskClass> myTaskList = new ArrayList<TaskClass>();

		final NoteClass myNote = new NoteClass(1);
		final TaskClass myTask = new TaskClass(2, "hallo");

		myNoteList.add(myNote);
		myTaskList.add(myTask);
		
		myNote.printList(myNoteList);
		myTask.printList(myTaskList);
	}
}

abstract class SuperClass<T extends SuperClass<T>> {

	void printList(final ArrayList<T> myList) {
		final int sizeOfList = myList.size();
		for (int i = 0; i < sizeOfList; i++) {
			print(myList.get(i));
		}
	}

	abstract void print(T s);
}

class NoteClass extends SuperClass<NoteClass> {

	private final int a;

	public NoteClass(final int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}
	
	@Override
	void print(final NoteClass s) {
		System.out.println(s.getA());
	}
}

class TaskClass extends SuperClass<TaskClass> {

	private final String b;
	private final int a;

	public TaskClass(final int a, final String b) {
		this.a = a;
		this.b = b;
	}
	
	public int getA() {
		return a;
	}

	public String getB() {
		return b;
	}
	
	@Override
	void print(final TaskClass s) {
		System.out.println(s.getA()+s.getB());
	}
}
Das birgt aber mehrere Probleme. Du musst mit den konkreten Typen arbeiten und kannst nicht auf die Schnittstellen zurückgreifen. Eine Möglichkeit dies zu umgehen wäre, die Parametrisierung erst bei der Objektinstanziierung anzugeben. Um das zu ändern müsstest du aber noch genauer spezifizieren was du erreichen möchtest.
Weiterhin ist eine Klasse nicht dafür zuständig ihre eigene Kopien zu verwalten. In Java tust du dir am leichtesten, wenn du ein weiteres Objekt hast, das diese Aufgabe übernehmen kann:
Java:
class MyModel {

	public MyModel() {
		{
			final ArrayList<SuperClass> myNoteList = new ArrayList<SuperClass>();
			final ArrayList<SuperClass> myTaskList = new ArrayList<SuperClass>();
		
			final SuperClass myNote = new NoteClass(1);
			final SuperClass myTask = new TaskClass(2, "hallo");
		
			myNoteList.add(myNote);
			myTaskList.add(myTask);
			
			final SuperClassPrinter s = new SuperClassPrinter();
			s.printList1(myNoteList);
			s.printList1(myTaskList);
		}
		{
			final ArrayList<NoteClass> myNoteList = new ArrayList<NoteClass>();
			final ArrayList<TaskClass> myTaskList = new ArrayList<TaskClass>();

			final NoteClass myNote = new NoteClass(1);
			final TaskClass myTask = new TaskClass(2, "hallo");

			myNoteList.add(myNote);
			myTaskList.add(myTask);
			
			final SuperClassPrinter s = new SuperClassPrinter();
			s.printList2(myNoteList);
			s.printList2(myTaskList);
		}
	}
}

abstract class SuperClass {

	abstract void print();
}

class NoteClass extends SuperClass {

	private final int a;

	public NoteClass(final int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}
	
	@Override
	void print() {
		System.out.println(getA());
	}
}

class TaskClass extends SuperClass {

	private final String b;
	private final int a;

	public TaskClass(final int a, final String b) {
		this.a = a;
		this.b = b;
	}
	
	public int getA() {
		return a;
	}

	public String getB() {
		return b;
	}
	
	@Override
	void print() {
		System.out.println(getA()+getB());
	}
}

class SuperClassPrinter {
	void printList1(final ArrayList<SuperClass> myList) {
		final int sizeOfList = myList.size();
		for (int i = 0; i < sizeOfList; i++) {
			myList.get(i).print();
		}
	}
	
	<T extends SuperClass> void printList2(final ArrayList<T> myList) {
		final int sizeOfList = myList.size();
		for (int i = 0; i < sizeOfList; i++) {
			myList.get(i).print();
		}
	}
}
Je nach dem ob du darauf angewiesen bist mit Spezialisierungen zu arbeiten oder dich nur auf die Schnittstellen verlassen kannst, steht es dir frei die Methodensignatur von
Code:
printListX
zu ändern. Was für dich am besten ist hängt, wie bereits gesagt, von deinem Context ab.
 

bERt0r

Top Contributor
Um Vererbung sinnvoll zu nutzen musst du natürlich auch ihre Vorteile anwenden:

Angenommen du hast eine Klasse Auto

Java:
class Auto{
	private int a;

	public Auto(int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}	
}

und eine Klasse Cabrio die von Auto erbt:
Java:
public class Cabrioextends Auto{

	private String b;

	public Cabrio(int a, String b) {
		super(a);
		this.b = b;
	}

	public String getB() {
		return b;
	}
}

Jetzt kannst du beide Objekte in einer einzigen Liste bearbeiten.
Java:
public class MyAutohandel{

	public MyAutohandel() {

	ArrayList<Auto> myAutoList= new ArrayList<Auto>();

	Auto a1= new Auto(1);
	Cabrio c1= new Cabrio (2, "hallo");

	myAutoList.add(a1);
	myAutoList.add(c1);	
	}
}

Wenn du jetzt deine Objekte z.b ausgeben willst, schreibst du eine Methode in Auto und überlagerst diese Methode in Cabrio.

Java:
class Auto{
	private int a;

	public Auto(int a) {
		this.a = a;
	}

	public int getA() {
		return a;
	}
public String toString()
{
  return String.valueOf(a);
}
	
}

und eine Klasse Cabrio die von Auto erbt:
Java:
public class Cabrioextends Auto{

	private String b;

	public Cabrio(int a, String b) {
		super(a);
		this.b = b;
	}

	public String getB() {
		return b;
	}

public String toString()
{
  return a+" "+b;
}
}
Dadurch kannst du beide Klassen mit der gleichen Methode ansprechen.
Java:
public class MyAutohandel{

	public MyAutohandel() {

	ArrayList<Auto> myAutoList= new ArrayList<Auto>();

	Auto a1= new Auto(1);
	Cabrio c1= new Cabrio (2, "hallo");

	myAutoList.add(a1);
	myAutoList.add(c1);	
     
        for(Auto help:myAutoList)
        {
               System.out.println(help.toString());
        }
}
}
 
Zuletzt bearbeitet:

membersound

Bekanntes Mitglied
Das ist super, und funktioniert auch in meinem Code und ist denk ich auch die beste Lösung.

Mein Problem war ja, dass ich die Objekte in unterschiedlichen ArrayList-Typen gesammelt habe, um deren print-Funktionen unterschiedlich aussehen zu lassen. Das geht ja jetzt :toll:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Frage zu Generics und Wildcards Java Basics - Anfänger-Themen 2
H Generics: Wildcards Java Basics - Anfänger-Themen 3
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
M Generics Vererbung Listen Java Basics - Anfänger-Themen 2
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
N Generics und Casting eines Objekts Java Basics - Anfänger-Themen 1
A Generics Java Basics - Anfänger-Themen 6
A Vererbung/Interfaces/Generics Java Basics - Anfänger-Themen 12
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
N Generics Vererbung Wildcard Interface Java Basics - Anfänger-Themen 8
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
D Generics - Warnmeldungen Java Basics - Anfänger-Themen 2
M Polymorphie generics einsteigerprobleme Java Basics - Anfänger-Themen 3
D Vererbung Generics und Vererbung Java Basics - Anfänger-Themen 8
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
O Abstract Method & Generics Java Basics - Anfänger-Themen 10

Ähnliche Java Themen

Neue Themen


Oben