Klasse Class in Generics

Unicate

Erfahrenes Mitglied
Hi alle zusammen!

Ich habe eine generic Klasse
Java:
public class meineklasse<E> {
}

und brauche jetzt beim programmieren dieser das Class object der enthaltenden Klasse E

Java:
E.class // geht nicht bzw.:
E.getClass(); // geht auch nicht

Wie funktionierts?
 
Zuletzt bearbeitet:
Du speicherst ja auch eine Klassendefinition in E und keine Instanz. Du könntest eine Instanz des Typs E übergeben und von diesem die Klasse hohlen. Aber denke daran, das es sich dabei einfach nur um Schablonen handelt.

btw. schreibt man Klassennamen groß und CamelCase.
 
Wegen Groß und Kleinschreibung: Jaja, war ja nur ein Beispiel...

Wegen dem Class Problem:

Naja ich verwende einen ServiceLoader in meiner Generic. Die "variable" Klasse soll geladen werden.

Java:
public class PluginLoader<E extends IPlugin> extends AbstractLoggable {

	protected ServiceLoader<E> applications;
	

	public void load() {
		registerPlugins();
		applications = ServiceLoader.load(? ? ?);
	}
 
In dem Fall würde ich nicht auf Generic setzen, sondern den Parameter per Methode/Konstruktor übergeben und vom Typ IPlugin definieren.
 
Ich wollte es mit generics versuchen, wenn ich's nicht hinbekomme werd ich's wohl mit methoden machen müssen.

@Thomas:
Simpler Fall:
Java:
public class MyGeneric<E> {
	public MyGeneric() {
		
	}
	public void printMyGenericClass() {
		System.out.println(((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
	}
}
Wirft beim Typecast eine Exception:
Code:
Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType


Andere Ideen wie man da herausfinden kann?
 
Zuletzt bearbeitet:
Hi,

das Problem ist, dass die Generic-Typisierung nur zur Compile-Zeit vorliegt und deswegen nicht zur Laufzeit abgefragt werden kann.

Selbiges hat mich mal beim erstellen eines DAO-Patterns mit Generics eingeholt.

Du kannst allerdings in Java ein Interface definieren, welches Dein Generic-Type dann beerbt :

Java:
public interface Foo {
  void doSomething();
}

und dann
Java:
public class Bar<E extends Foo> {

     public void doMore(E input) {
      E.doSomething();
    }
}

Eine weitere Krücke ist, einfach a) die Class von E in den Konstruktor der Klasse zu übergeben :

Java:
public class Bar<E extends Foo> {

     public Bar(Class<?> input) {
       .....
     }

     public void doMore(E input) {
      E.doSomething();
    }
}


oder b) eine Annotation zu bauen, die die Class enthält und diese zur Laufzeit auslesen:

Java:
@GenericServes(Foo.class)
public class Bar<E extends Foo> {

     public void doMore(E input) {
        ....
    }
}


Ich frage mich auch, warum diese Typeninformation nicht zumindestens dem Java-Reflection zugänglich gemacht wurde.

Grüße
gore
 
Hallo,

du musst dir die verlinkten Beispiele im Thread auch genau anschauen...
http://www.tutorials.de/forum/java/310803-java-generics-generischen-typ-ermitteln.html

Java:
package de.tutorials;

import java.lang.reflect.ParameterizedType;

public class GenericExamples {
  public static void main(String[] args) {
    MyGeneric<String> m = new MyGeneric<String>() { };
    m.printMyGenericClass();

  }

  static class MyGeneric<E> {
    public MyGeneric() {

    }


    public void printMyGenericClass() {
      System.out.println(((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
    }
  }

}

Ausgabe:
Code:
class java.lang.String

Gruß Tom
 
ich kenne den Aufruf, der da gezeigt ist, durchaus.

Der funktioniert nur eben nicht immer. Laut SUN hat das Typisierungsargument nur Compile Time Retention und wenn Du versuchst, den Templatetypen zur Laufzeitrauszukriegen, wirst Du feststellen, dass das eben nicht immer geht ;-)

Grüße
gore
 
Zuletzt bearbeitet:
Hallo,

. Laut SUN hat das Typisierungsargument nur Compile Time Retention und wenn Du versuchst, den Templatetypen zur Laufzeitrauszukriegen, wirst Du feststellen, dass das eben nicht immer geht
Das ist klar. Es sagt ja niemand, dass die Information immer vorhanden ist. Es gibt verschiedene Fälle in denen die generischen typ Informationen mit in die class Files reingeneriert wird.

Gruß Tom
 
Zurück