WIe erfahre ich den Elementtyp einer Liste zur Laufzeit?

RealHAZZARD

Erfahrenes Mitglied
Moin moin,

ich hab da mal ein Problem:
Meine Klasse bekommt eine Collection<E> und soll diese in sofern verwallten, dass neue Werte hinzugefügt werden können etc. Jetzt würde mich bei der Übergabe der Liste interssieren, von welchem Typ(also E^) die Listenelemente sind. Gibts da eine Möglichkeit?
 
Hallo,

danke fürdie schnelle Antwort, allerdings ist das nicht ganz das Richtige. Wenn ich mir mal die wirkliche relevante Zeile rausziehe und nutzen will:
Java:
Vector<String> bernd = new Vector<String>();
System.out.println((ParameterizedType)(bernd.getClass().getGenericSuperclass()));

Bekome ich natürlich nur Infos zur Liste...Ausgabe:
Code:
java.util.AbstractList<E>

Allerdings möchte ich den Typ der Listenelemente haben. Auch wenn nch kein Element vorhanden ist.
 
Hallo,

vielleicht hättest du dir das Beispiel mal ganz anschauen sollen. ;-)

Code:
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];

Das war nämlich der ganze Aufruf. :-)

MFG

zEriX
 
Oh stimmt. Huch.
Aber das ändert doch immernoch nichts. Ich bekomm doch nur Infos über die Liste selbst, nicht über den Typ der Elemente(auch wenn noch kein Element enthalten ist), oder sehe ichs einfach nicht?
 
Schau dir nochmal das Beispiel genau an.

Code:
static abstract class Foo<T> {
		Type type;

		/**
		 * @return the type
		 */
		public Type getType() {
			return type;
		}

		/**
		 * @param type
		 *            the type to set
		 */
		public void setType(Type type) {
			this.type = type;
		}

		public Foo() {
			this.type = ((ParameterizedType) getClass().getGenericSuperclass())
					.getActualTypeArguments()[0];
		}
	}

Das ist eine Inner-Class in dem Beispiel.

Code:
System.out.println(new Foo<String>() {
		}.getType())
Hier wird ein Object von dieser Klasse erzeugt und der Typ direkt ausgegeben.

Die Ausgabe ist hier
Code:
java.lang.String

MFG

zEriX
 
Ja es geht aber um eine Liste und da ist der Generische Typ nunmal E und den aktuellen Typ kann man auch nicht erfahren (soweit ich das nachgelesen habe).

Aber was geht ist folgendes:
Java:
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;

public class GenericTest {
	
	public static class ListTest extends ArrayList<String>{
		
	}
	
	public static void main(String [] args){
		ListTest test = new ListTest();
		System.out.println(((ParameterizedType)test.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
	}

}


Ausgabe:
Code:
class java.lang.String

Allerdings frage ich mich auch warum man einer Collection mit unbekanntem Generischen Typ Elemente hinzufügen möchte. Irgendwie habe ich sowas noch nie gebraucht :D
 
@zeja
Das ist doch genau das was Toms Beispiel macht.

Allerdings frage ich mich auch warum man einer Collection mit unbekanntem Generischen Typ Elemente hinzufügen möchte
Ich denke mal, dass er Collections mit unterschiedlichen Typisierungen hat und möchte unterscheiden können.

MFG

zEriX
 
Ok. Danke für die nähere Erklärung, aber wie kann ich das denn auf ein ObjeKt(bei mir ist es eine Collection) anwenden, das schon instanziert ist bevor ich es in die Klasse bekomme, und das ich auch nicht mit einer von mir geschriebenen Klasse (Hier Foo) erweitern darf? So wie ich es oben geschrieben habe, nur das bernd von irgendwo her kommen kann und in Wirklichkeit nicht von mir instanziert wird.

@^ ^ ^ Zerix^ ^ ^: genau das!
 
Ja zerix das ist genau das was Toms Beispiel macht. Das was RealHAZZARD aber versucht geht nunmal nicht direkt so, weil man mit ArrayList<String> den generischen Typ nur parametriert aber keine konkrete Klasse erstellt die den generischen Typ auf String einschränkt.

Sowas geht aber auch:
Java:
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

public class GenericTest {
	
	public static abstract class Foo<T> extends ArrayList<T>{
		
		Type type;

		public Type getType() {
			return type;
		}

		public void setType(Type type) {
			this.type = type;
		}

		public Foo() {
			this.type = ((ParameterizedType) getClass().getGenericSuperclass())
					.getActualTypeArguments()[0];
		}
		
	}
	
	public static void main(String [] args){
		Foo<String> foo = new Foo<String>(){};
		System.out.println(foo.getType( ));
	}
}

Wiederum nur weil die Klasse abstract ist und man die Klasse mit einem konkreten Typ erstellen muss, welcher dann auch ausgegeben werden kann.
 
Zurück