Generic Typ zur Laufzeit

Status
Nicht offen für weitere Antworten.

Dragonfire

Bekanntes Mitglied
Gibt es irgendeine Möglichkeit,
wie ich zur Laufzeit an den generischen Typ einer Klasse komme?

Oder sollte ich das class-Object einfach im Konstruktor mitgeben??
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Tja... bei mir stellt sich gerade auch ein Problem, Generics betreffend ein.
Ich habe festgestellt, dass Collections verschiedener generischer Typen (z.B. ArrayList<Panel> und ArrayList<Window>) [c]equal()[/c] sind, solange sie Leer sind. Es muss doch auch ohne dass ich eine Klasse an den Konstruktor übergebe, eine Möglichkeit geben, zu Erkennen, dass diese Collections niemals [c]equal()[/c] werden können.
 

Dragonfire

Bekanntes Mitglied
Ich habe drei Arten von Panels die von einem generischen Superpanel erben.
Jetzt musste ich nur irgendwie die Informationen / Daten auf die Panels bekommen,
dafür habe ich der generische Superklasse eine Art Proxyklasse mitgegeben,
welcher je nach Typ des Panels den Inhalt zurückgibt.
Zurzeit muss in im jeweiligen Panel immer dem Proxy mit passenden Typ übergeben,
dabei ist der Aufruf immer derselbe.

Kann auch sein,
dass ich irgendwo ein Entwurfsfehler habe ...
 

tfa

Top Contributor
Tja... bei mir stellt sich gerade auch ein Problem, Generics betreffend ein.
Ich habe festgestellt, dass Collections verschiedener generischer Typen (z.B. ArrayList<Panel> und ArrayList<Window>) [c]equal()[/c] sind, solange sie Leer sind. Es muss doch auch ohne dass ich eine Klasse an den Konstruktor übergebe, eine Möglichkeit geben, zu Erkennen, dass diese Collections niemals [c]equal()[/c] werden können.

Wenn sie leer sind, sind sie gleich. Siehe API-Doku. Keine Äpfel ist genau das gleiche wie keine Birnen.
Davon abgesehen hat die Laufzeitumgebung keine Möglichkeit, den Typparameter herauszufinden. Das kann aber der Compiler. Wenn der das kann, kannst du es auch, d.h. der Vergleich zwischen typinkompatiblen Listen kann man sich sparen.
 

Landei

Top Contributor
Tja... bei mir stellt sich gerade auch ein Problem, Generics betreffend ein.
Ich habe festgestellt, dass Collections verschiedener generischer Typen (z.B. ArrayList<Panel> und ArrayList<Window>) [c]equal()[/c] sind, solange sie Leer sind. Es muss doch auch ohne dass ich eine Klasse an den Konstruktor übergebe, eine Möglichkeit geben, zu Erkennen, dass diese Collections niemals [c]equal()[/c] werden können.

Du könntest Unterklassen machen:

Java:
public class WindowList extends ArrayList<Window> {

   @Override equals(Object o) {
       return (! (o instanceof  WindowList)) ? false : super.equals(o);
   }

}
 

Landei

Top Contributor
Ich habe drei Arten von Panels die von einem generischen Superpanel erben.
Jetzt musste ich nur irgendwie die Informationen / Daten auf die Panels bekommen,
dafür habe ich der generische Superklasse eine Art Proxyklasse mitgegeben,
welcher je nach Typ des Panels den Inhalt zurückgibt.
Zurzeit muss in im jeweiligen Panel immer dem Proxy mit passenden Typ übergeben,
dabei ist der Aufruf immer derselbe.

Kann auch sein,
dass ich irgendwo ein Entwurfsfehler habe ...

Möglich... dazu müsste man aber wenigstens mal ein paar Codefetzen sehen.
 
S

Spacerat

Gast
Du könntest Unterklassen machen:

Java:
public class WindowList extends ArrayList<Window> {

   @Override equals(Object o) {
       return (! (o instanceof  WindowList)) ? false : super.equals(o);
   }

}
Ja, das ist stand der Dinge. Will sagen so musste ich es lösen.
Aber: Keine Äpfel sind keine Birnen...? Hmm...
Also... Ich wollte eine allgemeine typisierbare Collection schreiben, der man [c]ModifyEventListener[/c] hinzufügen kann und einer [c]ModifyEventQueue[/c] eine [c]Map<Modifyable, ModifyEventListener>[/c] ([c]Modifyable[/] ist dabei ein Interface, dass von der Collection implementiert wird.) anlegen, wo die erstellten Collections gesammelt werden. Pustekuchen: Egal, welche [c]Map[/c] ich verwende, ich kann dort nur eine leere Collection einfügen, auch wenn sie nur durch den Typparameter unterschieden werden. Was soll's. Letztendlich musste eine [c]Map[/c] geschaffen werden, die beim Einfügen, Entfernen und Lesen auf Identität statt auf inhaltliche Gleichheit prüft.
 

Dragonfire

Bekanntes Mitglied
Möglich... dazu müsste man aber wenigstens mal ein paar Codefetzen sehen.

Ich hab jetzt natürlich viele Sachen ausgeschnitten,
für Vererbung habe ich mich entschieden,
weil die "Untertabellen" (ArticleTable, CustomerTable, ...)
noch individuell angepasst werden müssen ....
Vielleicht hat aber wer eine bessere Lösung.
Würde mich mal interessieren.

Java:
public abstract class DvsTable<DATA> extends JPanel {
	protected SQLDataProxy<DATA> proxy;
	protected ArrayList<DATA> items;
	protected JTable table;
	protected AbstractTableModel tableModel;
	protected DvsDetailPanel<DATA> detailPanel;
	...

	public DvsTable(DatenSchnittstelle db, ...) {
		...
		init();
	}

	protected void init() {
		...
		initTable();
		initCustom();
	}
	
	abstract protected void initTable();
	
	abstract protected void initCustom();
}

public class CustomerTable extends DvsTable<Kunde> {

	public CustomerTable(...) {
		super(...);
	}

	@Override
	protected void init() {
		this.proxy = new SQLDataProxy<Kunde>(Kunde.class, this.db);
		super.init();
	}
	
	@Override
	protected void initCustom() {
		super.detailPanel = new CustomerDetailPanel(super.proxy, super.iM,
				super.info);
		((CustomerDetailPanel) super.detailPanel)
				.setExpandListener(new ActionListener() {

					@Override
					public void actionPerformed(ActionEvent e) {
						...
					}
				});
	}

	@Override
	protected void initTable() {
		super.tableModel = new CustomerTableModel();
	}

	private class CustomerTableModel extends AbstractTableModel {
		...
		@SuppressWarnings("boxing")
		@Override
		public Object getValueAt(int rowIndex, int columnIndex) {
			Object o = null;
			switch (columnIndex) {
			case 0:
				o = CustomerTable.super.items.get(rowIndex).getKundenID();
				break;
			case 1:
				o = CustomerTable.super.items.get(rowIndex).getName();
				break;
			case 2:
				o = CustomerTable.super.items.get(rowIndex).getVorname();
				break;

			default:
				break;
			}
			return o;
		}
	}
	
	public static void main(String[] args) {
		JFrame f = new JFrame("CustomerTable");
		...
		f.add(new CustomerTable(new DatenSchnittstelle(...), ...);
		...
	}
}

public abstract class DvsDetailPanel<DATA> extends JPanel {
	protected SQLDataProxy<DATA> proxy;
	protected DATA data;
	...

	public DvsDetailPanel(...) {
		...
		init();
	}

	protected void init() {
		...
	}
}

public class CustomerDetailPanel extends DvsDetailPanel<Kunde> {
	private JTextField kundenTextField;
	...

	public CustomerDetailPanel(...) {
		super(...);
	}

	@Override
	protected void init() {
		this.kundenTextField = new JTextField(super.data.getKundenName());
		JPanel.add(this.kundenTextField);
		...
		super.init();
	}
}

public class SQLDataProxy<E> {
	private Class<?> e;
	private DatenSchnittstelle db;
	...
	
	public SQLDataProxy(Class<?> e, DatenSchnittstelle db) {
		this.e = e;
		this.db = db;
	}

	...

	@SuppressWarnings("unchecked")
	public E getItem(int id) {
		E item = null;
		if (this.e == Artikel.class) {
			item = (E) this.db.getArtikel(id);
		} else if (this.e == Kunde.class) {
			item = (E) this.db.getKunde(id);
		}
		return item;
	}

	public void addItem(E item) {
		if (this.e == Artikel.class) {
			this.db.addArtikel((Artikel) item);
		} else if (this.e == Kunde.class) {
			this.db.addKunde((Kunde) item);
		}
	}
}

public class DatenSchnittstelle {
	...
	public Artikel getArtikel(int ArtikelNr) {
		...
	}
	
	public Kunde getKunde(int kundenID) {
		...
	}
}

Bei table_gui.pdf ist das Ganze ein CustomTable,
das Panel im unteren des JSplitPane ist ein CustomerDetailPanel (erbt von DetailPanel)...

Bei Fragen einfach melden ;)
 
Zuletzt bearbeitet:

Landei

Top Contributor
Ja, das ist stand der Dinge. Will sagen so musste ich es lösen.

Oder halt über Class-Objekte, dann brauchst du nur eine Extra-Klasse:
Java:
RuntimeTypeList<T> extends ArrayList<T> {

   private final Class<T> clazz;

   public RuntimeTypeList(Class<T> clazz) {
       this.clazz = clazz;
   }
   @Override equals(Object o) {
       return (! (o instanceof  RuntimeTypeList) || 
               ! clazz.equals(((RuntimeTypeList)o).clazz)) ? false : super.equals(o);
   }
 
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Generic Type einer Generischen Klasse während der Laufzeit bekommen Allgemeine Java-Themen 2
P Generic zur Laufzeit Allgemeine Java-Themen 4
byte Generic Type einer List zur Laufzeit rausfinden? Allgemeine Java-Themen 4
O Werte einer Generic LinkedList zusammenrechenen Allgemeine Java-Themen 14
Rakshan Generic reading of XML document from the root tag into an Collection Allgemeine Java-Themen 0
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
Neumi5694 Methoden Generic: Rückgabetyp als Class-Parameter übergeben Allgemeine Java-Themen 3
Neumi5694 Datentypen Generic mit parameterlosem Konstructor Allgemeine Java-Themen 4
C Generic collections und static typing Allgemeine Java-Themen 4
K Generic class und Reflection Allgemeine Java-Themen 2
K Saubere Verwendung von Generic Types Allgemeine Java-Themen 7
T Generic Allgemeine Java-Themen 1
C Generic-Funktion nur bei bestimmten Typen erlauben Allgemeine Java-Themen 6
M Cannot create a generic array of T Allgemeine Java-Themen 5
N Generic extends Generic Allgemeine Java-Themen 5
TheWhiteShadow Generic Bug? Allgemeine Java-Themen 19
X Generic muss zwei Klassen/Interfaces erfüllen Allgemeine Java-Themen 5
S Reflection und Generic Allgemeine Java-Themen 9
G Klasse eines Generic Allgemeine Java-Themen 6
J Generic von einer ArrayList/HashMap bekommen Allgemeine Java-Themen 7
G Generic merhfach Angabe Allgemeine Java-Themen 8
N Casten durch generic vermeiden ?? Allgemeine Java-Themen 10
N generic reflection Allgemeine Java-Themen 5
thE_29 Generic Methoden die sich aufrufen wollen nicht immer Allgemeine Java-Themen 12
A Generic-Problem. was meint ihr dazu? Allgemeine Java-Themen 4
G unbekanntes Generic Allgemeine Java-Themen 12
K Bound mismatch: The generic method sort(List<T>) of ty Allgemeine Java-Themen 4
V ArrayList ist nicht generic!?? Oder bin ich blöd? Allgemeine Java-Themen 2
G [quote]the type HashMap is not generic; it cannot be paramet Allgemeine Java-Themen 4
C Generic Type ermitteln Allgemeine Java-Themen 3
H References to generic type Test.A<typ> should be param Allgemeine Java-Themen 5
S Build-Zeitpunt (Datum und Uhrzeit) irgendwie während der Laufzeit zugänglich machen..? Allgemeine Java-Themen 4
M Laufzeit des Prim Algorithmus Allgemeine Java-Themen 3
M Laufzeit LinkedList Allgemeine Java-Themen 9
M verbesserte Laufzeit bei LinkedList Allgemeine Java-Themen 7
K Verbesserung der Laufzeit beim Sortieren von Einwohnern nach ihrem Geburtsjahr Allgemeine Java-Themen 0
H was ist den dieses zur Kompilierzeit und zur Laufzeit in Java? Allgemeine Java-Themen 3
L Classpath Zur Laufzeit bestimmte Klassen in Classloader hinzufügen? Allgemeine Java-Themen 4
L Compiler-Fehler Google Guice Module zur Laufzeit zusammenstellen und binden Allgemeine Java-Themen 4
J Jasper Reports - Subreport zur Laufzeit ändern Allgemeine Java-Themen 6
O jar und EXE Dateien, Pfade zur Laufzeit Allgemeine Java-Themen 1
T Externe Java Klasen zur Laufzeit einbinden Allgemeine Java-Themen 10
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
D Boolean von ein anderem Java Programm während der Laufzeit ändern Allgemeine Java-Themen 23
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
Neumi5694 Interpreter-Fehler final Eigenschaft während Laufzeit geändert Allgemeine Java-Themen 2
A Java Klasse auf Tomcat während der Laufzeit austauschen Allgemeine Java-Themen 1
M Sinn von Kompilierung zur Laufzeit Allgemeine Java-Themen 3
T Java Class Intrumentation mit Annotations in Laufzeit Allgemeine Java-Themen 1
S Byte Array welches in Laufzeit aufgelöst wird // Objekt Array Allgemeine Java-Themen 3
T Dateien zur Laufzeit in Java-Programm packen? Allgemeine Java-Themen 3
S Laufzeit Primzahlgenerator Allgemeine Java-Themen 18
S Zur Laufzeit Klasse mit einer anzahl von X Objekten erstellen Allgemeine Java-Themen 5
F Classpath Programmteile zur Laufzeit nachladen Allgemeine Java-Themen 6
D Variablen zur Laufzeit global speichern (Registry Pattern?) Allgemeine Java-Themen 6
H ResourceBundle während Laufzeit bearbeiten Allgemeine Java-Themen 3
J Input/Output Jar-Datei zur Laufzeit erweitern Allgemeine Java-Themen 13
A ar während der Laufzeit überschreiben Allgemeine Java-Themen 20
X MergeSort Laufzeit Problem Allgemeine Java-Themen 4
J Resourcen waehrend der Laufzeit aendern? Allgemeine Java-Themen 9
P Wie bei log4j den Dateipfad der Logdatei zur Laufzeit ändern? Allgemeine Java-Themen 3
X Update einer Jar während der Laufzeit Allgemeine Java-Themen 8
T Klassen Fabrik (Factory) zur Laufzeit erweitern Allgemeine Java-Themen 5
S UML zur Laufzeit ändern Allgemeine Java-Themen 10
E Wert von enum zur Laufzeit festlegen. Allgemeine Java-Themen 5
L Methode in Thread mit langer Laufzeit unterbrechen (ANT executeTarget) Allgemeine Java-Themen 4
O Problem bei Darstellung der Laufzeit eines Programms Allgemeine Java-Themen 3
hdi Ressourcen dynamisch zur Laufzeit laden Allgemeine Java-Themen 15
A Wie zur Laufzeit auf Objekte zugreifen Allgemeine Java-Themen 7
N variable Anzahl von Objektinstanzen zur Laufzeit erstellen Allgemeine Java-Themen 4
P Java Konsole zur Laufzeit einblenden Allgemeine Java-Themen 4
P Klassenwahl zur Laufzeit Allgemeine Java-Themen 5
R Objekt zur Laufzeit zerstören? Allgemeine Java-Themen 12
E formartierte Ausgabe zur Laufzeit Allgemeine Java-Themen 2
Sonecc Zugriff auf Class File einer anderen Jar während der Laufzeit Allgemeine Java-Themen 2
F Wie zur Laufzeit ganz neue Objekte erzeugen? Allgemeine Java-Themen 5
T Class-files zur Laufzeit zu Reflection-Zwecken laden Allgemeine Java-Themen 18
DamienX Debug Modus zur Laufzeit erkennen Allgemeine Java-Themen 3
Stillmatic Debuggen/ Laufzeit von Methoden Allgemeine Java-Themen 2
M Klasse zur Laufzeit ersetzen Allgemeine Java-Themen 10
S Wie gross ist die Laufzeit für diese Schleife?? Allgemeine Java-Themen 8
G File zur Laufzeit erzeugen Allgemeine Java-Themen 4
G Jar File zur Laufzeit ändern. Allgemeine Java-Themen 4
T Java - Compilieren während Laufzeit Allgemeine Java-Themen 3
Y JARs austauschen zur Laufzeit Allgemeine Java-Themen 11
G Datenbank zur laufzeit wechseln Allgemeine Java-Themen 11
C Innere Klassen zur Laufzeit Instanzieren Allgemeine Java-Themen 4
T Zur Laufzeit erben? Allgemeine Java-Themen 22
L HashMap / Objekte auf Festplatte zur Laufzeit auf HD swappen Allgemeine Java-Themen 7
L Zur Laufzeit eine Klasse laden, die auf jar-File zugreift Allgemeine Java-Themen 15
V Java-Programm weiss zur Laufzeit wie es gestartet wurde? Allgemeine Java-Themen 6
N Endlosschleifen automatisiert erkennen (Code oder Laufzeit)? Allgemeine Java-Themen 6
G Eindeutiges Identifizieren einer JTable/Component z.laufzeit Allgemeine Java-Themen 2
G Datei durchsuchen, lange Laufzeit! Allgemeine Java-Themen 2
A log4j 1.3 und ändern der log Konfiguration zur Laufzeit Allgemeine Java-Themen 4
Apo Zur Laufzeit Klassen mit Packages laden? Allgemeine Java-Themen 2
G genauen Typ einer generischen Klasse zur Laufzeit ermitteln Allgemeine Java-Themen 2
F Typ eines Objekts zur Laufzeit bestimmen? Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben