Class von “Type Parameter” – Java Generics (gepimpt)

Meine Lösung von gestern funktioniert nicht, wenn die Klassenhierarchy tiefer als Eins ist. Die Methode getGenericSuperclass() liefert eben nur die Superklasse der aktuellen Klasse. Es ist also noch notwendig die Hierarchie nach Dada zu suchen um die Typinformation zu bekommen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
 
public class Parameterized {
    public static void main(String[] args) {
        new SubDada();
        new SubSubDada();
    }
}
 
abstract class Dada<T> {
    private Class<T> typeOfT;
    public Dada() {
        this.typeOfT = getTypeOfT();
        System.out.println("typeOfT: " + this.typeOfT);
    }
    @SuppressWarnings("unchecked")
    private Class<T> getTypeOfT() {
        ParameterizedType pType = getDadaAsParameterizedType(getClass());
        return (Class<T>) pType.getActualTypeArguments()[0];
    }
    private ParameterizedType getDadaAsParameterizedType(Class<?> clazz) {
        Object gstype = clazz.getGenericSuperclass();
        if (gstype instanceof ParameterizedType) {
            ParameterizedType ptype = (ParameterizedType) gstype;
            Type rawtype = ptype.getRawType();
            if (Dada.class.equals(rawtype)) {
                return ptype;
            }
        }
        return getDadaAsParameterizedType(clazz.getSuperclass());
    }
}
 
class SubDada extends Dada<String> {
    public SubDada() {
    }
}
 
class SubSubDada extends SubDada {
    public SubSubDada() {
    }
}
  • Share/Bookmark

Post a Comment

You must be logged in to post a comment.