Generics und Vererbung

kaoZ

Top Contributor
Ich spiele grade beim Refactoring mit Generics rum, und habe meine Konzepte nochmal überdacht,

ich haben eine Klasse angelegt die meine Daten in Form eines VO's halten soll, diese Klasse ist generisch :

Java:
import java.io.Serializable;
import java.util.ArrayList;

@SuppressWarnings("serial")
public class ValueObject<T> implements Serializable{

	private ArrayList<T> data;
	
	public ValueObject(){
		init();
	}
	
	public ValueObject(ArrayList<T> list){
		data = list;
	}
	
	@SafeVarargs
	public ValueObject(T...t){
		this();
		if(t.length > 0) {
			for (int i = 0; i < t.length; i++) {
				data.add(t[i]);
			}
		}
	}
	
	private void init(){
		data = new ArrayList<>();
	}
	
	public ValueObject<T> copy(){
		return new ValueObject<>(getData());
	}
	
	@Override
	public boolean equals(Object o){
		
		boolean val = false;
		
		ValueObject<?> other = (ValueObject<?>) o;
		
		for (int i = 0; i < data.size(); i++) {
			if(data.size() == 0) {
				val = this == other;
			}
			val = data.get(i) == other.get(i);
		}
		return val;
	}
	
	public ArrayList<T> getData()			{return data;}
	public int getSize()					{return data.size();}
	public T get(int index)					{return data.get(index);}
}

Ich möchte eigentlich den Typ des ValueObjectes erst in der jeweiligen Spezialisierung festlegen , oder sollte ich dazu übergehen dann wirklich in jeder Speziealisierung ein eigenes VO zu halten ? Was eigentlich nicht mein Ziel war . :)


Ein Object dieser Klasse möchte ich nun in einer abstrakten klasse als Attribut verwenden :

Java:
import java.io.Serializable;
import editor.valueObjects.ValueObject;

@SuppressWarnings("serial")
public abstract class Entity implements Serializable{
	
	public static int ID = 1;

	protected ValueObject<? extends Object> valueObject;
	
	public Entity(Object...objects){
		valueObject = new ValueObject<>(objects);
	}
	
	public Entity(ValueObject<? extends Object> obj){
		valueObject = obj;
	}
	
	public abstract int getID();
	public abstract Entity copy();
	public abstract String getSaveName();
	
	public ValueObject<? extends Object> getValueObject()	{return valueObject;}
}

Hiervon möchte ich nun Subklassen erstellen :

wie z.B Client oder auch User ,

die Frage ist nun , wie kann ich , bis auf das Verwenden einer Wildcard nun z.B im Konstruktor der noch nicht aufgeführten Klasse User/Client festlegen das hier nur Strings im Konstruktor übergeben werden dürfen ?

Muss ich tatsächlich alle Argumente Casten ? oder gibt es da einen schöneren Weg als das hier :

Java:
@SuppressWarnings("serial")
public class Client extends Entity{

	
	public Client(String...input){
		super(input); // <--- hier sagt er mir ich müsste die Varags auf Object Casten 
		
		/*
		 * gibt es keine Möglichkeit dies anders zu realisieren außer die Klasse 
		 * Entity/Client selbst Generisch zu machen ?
		 * Oder muss ich Casten ?
		 */
	}
	
	@Override
	public int getID(){
		return 0;
	}

	@Override
	public Entity copy(){
		return null;
	}

	@Override
	public String getSaveName(){
		return null;
	}

}

ich dachte da ich in Entity eh mit <? extends Object> arbeite müsste ich nicht zwingend Casten, aber pustekuchen... also muss ich wohl tatsächlich Client/Entity als Generisch deklarieren oder ?

EDIT

Ich müsste ja bereits hier den Konstruktor anders deklarieren sonst lege ich mich ja schon auf Object fest....

Java:
public Entity(Object...objects){
   valueObject = new ValueObject<>(objects);
}


aber wie wenn Entity nicht generisch ist ^^ ?

Sprich kann ich ja nicht einfach T...t verwenden , da der Platzhalten in Entity nicht bekannt ist.

Wenn ich Entity einfach als Generisch deklariere funktioniert das reibungslos, da ich einfach den Platzhalter übergebe :

Java:
import java.io.Serializable;
import editor.valueObjects.ValueObject;

@SuppressWarnings("serial")
public abstract class Entity<T> implements Serializable{
	
	protected static int ID = 1;

	protected ValueObject<T> valueObject;
	
	@SafeVarargs
	public Entity(T...t){
		valueObject = new ValueObject<>(t);
	}
	
	public Entity(ValueObject<T> obj){
		valueObject = obj;
	}
	
	public abstract int getID();
	public abstract Entity<T> copy();
	public abstract String getSaveName();
	
	public ValueObject<? extends Object> getValueObject()	{return valueObject;}
}

und dann in Client

Java:
@SuppressWarnings("serial")
public class Client extends Entity<String>{
	
	public Client(String...input){
		super(input); 
	}
	
	@Override
	public int getID(){
		return 0;
	}

	@Override
	public Entity<String> copy(){
		return null;
	}

	@Override
	public String getSaveName(){
		return null;
	}

}

Ist das so gewollt oder gibt es da noch einen anderen Weg ?

Sinn dahinter ist das ich nachher nicht bei den ganzen Settern jedes Feld wie z.B
in der Klasse Client
Java:
public String getName()	{return valueObject.get(0);}

auf den Rückgabetyp Casten muss....
 
Zuletzt bearbeitet:

Joose

Top Contributor
Soweit ich weiß gibt es hier glaub ich keinen anderen Weg.
Aber ich finde diesen auch nicht so schlecht, oder gibt das bei dir woanders Probleme?
 

kaoZ

Top Contributor
Also ich hab jetzt folgendes gemacht :

Java:
import java.io.Serializable;
import editor.valueObjects.ValueObject;

@SuppressWarnings("serial")
public abstract class Entity<T> implements Serializable{
	
	protected static int ID = 1;

	protected ValueObject<T> valueObject;
	
	@SafeVarargs
	public Entity(T...t){
		valueObject = new ValueObject<>(t);
	}
	
	public Entity(ValueObject<T> obj){
		valueObject = obj;
	}

	
	public abstract int getID();
	public abstract Entity<T> copy();
	public abstract String getSaveName();
	
	
	public T get(int index) 			{return valueObject.get(index);}
	public ValueObject<T> getVO()		{return valueObject;}
}

Client
Java:
import editor.valueObjects.ValueObject;


@SuppressWarnings("serial")
public class Client extends Entity<String>{
	
	private int id;
	
	public Client(String...input){
		super(input);
		id = ID++;
	}
	
	public Client(ValueObject<String> obj){
		super(obj);
	}
	
	@Override
	public int getID(){
		return id;
	}

	@Override
	public Entity<String> copy(){
		return new Client(getVO());
	}

	@Override
	public String getSaveName(){
		return null;
	}
	
	@Override
	public boolean equals(Object o){
		if(o == null) {
			return false;
		}		
		Client other = (Client) o;

		return this.getVO().equals(other.getVO());
	}

	public String getName()				{return get(0);}
}

und das scheint bis jetzt ganz gut zu funktionieren :) ich wollte halt eigentlich ein Generisches Objekt ohne mich auf einen Typ festlegen zu müssen in einer Nicht Generischen Abstrakten Klasse verwenden, das macht es aber echt kompliziert , und führt zu unzähligen Casts in einer Spezialisierung.....

Das hier schaut doch zumindest bis jetzt ganz gut aus :

Java:
public class Main{

	public static void main(String[] args) throws Exception{
		
		Entity<String> e = new Client("Max","Müller");
		
		Entity<String> f = e.copy();
		
		System.out.println(e.equals(f));
		
		System.out.println(((Client)e).getFullName());
	}
}

Ausgabe :

Code:
true
Max Müller

Muss ich halt die Entität an der Stelle wo es nötig ist auf den Typ DownCasten :)

Dachte nur da gibts vielleicht eine schöne Möglichkeit anstatt Entity auch generisch zu machen .

Eigentlich isses auch nicht weiter wild , so bestimme ich halt über den Typ der Entität, den Typ des ValueObjektes.......scheint zumindest so ganz gut zu funktionieren,
mich stört halt nur da rein vom Logischen her ja nicht die Entität Generisch ist sondern halt das Value Object ^^
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
Das Sezialisieren des ValueObjektes in z.B ein ContactDataVO macht auch keinen Sinn da ich ja sonst doch dazu übergehen müsste den einzelnen Entitäten einen Spezialisierten Typ als als Attribut zu geben, also scheint es wohl tatsächlich der Beste Weg zu sein einfach die Entität Generisch zu deklarieren und einfach die Spezialisierungen vom Typ der Entität abhängig zu machen.

Aber das haut hin , geile S******e :p

Ich wollte das ganze halt soweit wie möglich Abstrahieren ;) Funzt !

So kann ich später einfach eine Komplette HashMap<String, Entity> ganz einfach Serialisieren und wieder einlesen :)
Java:
public class Main{

	@SuppressWarnings("serial")
	public static void main(String[] args) throws Exception{
		
		Entity<String> e = new Client("Max","Müller");
		
		SerializeUtil<Entity<String>> ser = new SerializeUtil<>();
		
		ser.save(e, "H:/Apps", e.getSaveName());
		
	}
}

EDIT

Gibt keine Möglichkeit mehr das Thema zu schließen ?
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
W Generics + Vererbung Allgemeine Java-Themen 47
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
G Generics und Vererbung. Allgemeine Java-Themen 21
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
darekkay Generics: Wildcard und Object Allgemeine Java-Themen 5
H Collections Generics und Reflection Allgemeine Java-Themen 6
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben