Generic zur Laufzeit

pl4gu33

Top Contributor
Ich befasse mich gerade in Eigenregie mit Generics und hab eine Frage,...

Wenn ich das richtig verstanden habe löscht der Compiler beim Übersetzen alle Generics. Also könnte man zur Laufzeit, wenn man an die Listen o.ä. rankommt, per Reflection einfach irgendwelche Typen einfügen und so Fehler produzieren oder habe ich da was falsch verstanden ? 🙂

Die "Generic"- Prüfung, ob man in eine ArrayList<String> auch wirklich nur Strings reinpackt, existiert nur beim "Programmieren" (z.b. in der IDE)?
 
Zuletzt bearbeitet:
Genau, die werden beim kompilieren entfernt und durch casts/rawtypes ersetzt. Das ganze nennt sich Type Erasure.

Aus
Java:
List<Integer> integers = new List<Integer>();
Integer i = integers.get(0);
wird
Java:
List integers = new List();
Integer i = (Integer)integers.get(0);
 
kann man auch mir reflection testen
Java:
public class ListMain 
{
	public static void main(String[] args) 
	{
		final List<Integer> list = new ArrayList<Integer>();
		list.add(Integer.valueOf(4));
		list.add(Integer.valueOf(45));
		list.add(Integer.valueOf(17));
		list.add(Integer.valueOf(56));
		add(list, "????");
		list.add(Integer.valueOf(74));
		list.add(Integer.valueOf(723));
		list.add(Integer.valueOf(3423));
		out(list);
	}
	
	private static void out(List<Integer> list) 
	{
		for(final Object obj : list)
		{
			System.out.println(obj.toString());
		}
	}
	
	private static void add(final List<Integer> list, final Object obj) 
	{
		try 
		{
			final Method m = list.getClass().getMethod("add", Object.class);
			m.invoke(list, obj);
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		} 
	}
}
 
Dafür brauchst aber kein Reflection, das geht auch wunderbar ohne.

Java:
List<Integer> integers = new ArrayList<Integer>();
integers.add(1);
integers.add(2);

List rawList = integers;
rawList.add("Drei");

System.out.println(integers);
 

Neue Themen


Zurück
Oben