Konkreten Typ eines generischen Parameters einer Klasse ermitteln?

DarthShader

Erfahrenes Mitglied
Hallo,

ich würde gerne den festgelegten generischen Typ einer Klasse zur Laufzeit ermitteln. Ich weiß natürlich um das TypeErsarure bei Java Generics, aber wenn ich das hier habe:

Java:
public abstract class AbstractConverter< S > {
  // ...
}


public class StringConverter< String > {
  // ...
}

ist es dann möglich zur Laufzeit zu ermitteln, dass StringConverter als generischen Typen "String" hat? Die Information steht ja konkret dort und ist kein Platzhalter mehr, das müsste doch irgendwie möglich sein.


Über Eure Hilfe würde ich mich sehr freuen


Vielen Dank!
 
Eine Variante ist sicherlich in der abstrakten Klasse eine abstrakte Methode GetConverterType vorzuschreiben, welche dann in jeder Ableitung implementiert wird und dir den jeweiligen Typ zurückgibt.
 
Moin!
Oder so:
Code:
TypeVariable[] vars = StringConverter.class.getTypeParameters();
for(TypeVariable t: vars){
    System.out.println(t);
}

Ausgabe
Code:
String

*grüssle*
 
Nanu, bei mir ist

Java:
StringConverter.class.getTypeParameters().length == 0

mache ich irgendwas offensichtliches falsch? :)
 
Hallo,

du musst die Abfrage bei der Elternklasse machen. Also bei der Klasse, die diesen Paramter definiert.

Gruß

Sascha

//EDIT: Da hab ich mich offensichtlich geirrt. ;-)
 
Mal als komplettes Beispiel:
Code:
package javaapplication5;

import java.lang.reflect.TypeVariable;
import javaapplication5.AbstractConverter.StringConverter;

public class Main {

    public static void main(String args[]) {
       try {

           TypeVariable[] vars = StringConverter.class.getTypeParameters();
           for(TypeVariable t: vars){
               System.out.println(t.getName());

           }

        }
        catch(Exception e){
           e.printStackTrace();
       }
    }

}

Code:
package javaapplication5;

import java.lang.reflect.TypeVariable;

public abstract class AbstractConverter<T> {

    public static class StringConverter< String > extends AbstractConverter{


    }
    public static void main(String args[]) {
       try {

           TypeVariable[] vars = StringConverter.class.getTypeParameters();
           for(TypeVariable t: vars){
               System.out.println(t.getName());

           }

        }
        catch(Exception e){
           e.printStackTrace();
       }
    }
}
 
Hallo,

hm ich denke ich erkenne nun einen Teil des Problems - wahrscheinlich ist, dass ich mein Beispiel ganz oben falsch formuliert habe. Eigentlich habe ich soetwas:

Java:
public abstract class AbstractConverter< S > {
  // ...
}
 
public class StringConverter extends AbstractConverter< String > {
  // ...
}

Der StringConverter ist damit ein konkreter typ, indem die Basis-Klasse konkret parametrisiert wird - sorry, das war mein Fehler.

Jetzt bezogen auf die korrigierte Variante, wie bekomme ich nun raus, dass StringConverter quasi den Typ String als konkreten Typ für die Basisklasse hat? Ist das möglich?

Zusatz: ich möchte als Ergebnis nicht "String" haben - also nicht den Namen des generischen Typs, sondern das Ergebnis muss "java.lang.String" sein, also der wirkliche Typ/die Klasse.
 
Schau mal hier
Code:
public static void main(String[] args) {
		Type genericSuperclass = StringConverter.class.getGenericSuperclass();
		ParameterizedType genericSuperclass2 = (ParameterizedType) genericSuperclass;
		System.out.println(genericSuperclass2.getActualTypeArguments()[0]);;

	}
 
Code:
package javaapplication5;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public abstract class AbstractConverter<T> {

    public static class StringConverter extends AbstractConverter< String > {


    }
    public static void main(String args[]) {
       try {
         Type type = (Class)((ParameterizedType)StringConverter.class.getGenericSuperclass()).getActualTypeArguments()[0];
         System.out.println(type);

        }
        catch(Exception e){
           e.printStackTrace();
       }
    }
}


Edit: Mist zu langsam ;)
 
Zurück