2010-05-10 13 views
21

Gibt es eine Möglichkeit, ein Klassenobjekt aus der Typvariable in der generischen Java-Klasse zu erhalten? So etwas Ähnliches:Java-Klassenobjekt vom Typ Variable

public class Bar extends Foo<T> { 
    public Class getParameterClass() { 
     return T.class; // doesn't compile 
    } 
} 

Diese Informationen sind zum Zeitpunkt der Kompilierung zur Verfügung und sollen daher nicht von Typ Löschung betroffen sein, so theoretisch sollte es eine Möglichkeit geben, dies zu erreichen. Existiert es?

+2

Sollte Ihre Erklärung wirklich public class Bar sein Foo erweitert {... ?? – Kilokahn

Antwort

25

Dies funktioniert:

public static class Bar extends Foo<String> { 
    public Class<?> getParameterClass() { 
    return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 
+0

-1. Es kann einfach nicht. http://java.sun.com/docs/books/tutorial/java/generics/erasure.html – Roman

+4

@Roman Es kann nicht? Probieren Sie es einfach aus. Downvoting ohne es zu tun, während Sie auf Ihrer falschen Antwort besteht, ist sowieso lächerlich. – sfussenegger

+0

@Roman: Es kann einfach. Warum versuchst du es nicht selbst? –

6

Der Code-Snippet ist ein wenig verwirrend. Ist T ein Typparameter oder eine Klasse?

public static class Bar extends Foo<String> { 
    public Class<?> getParameterClass() { 
     return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 

public static class Bar2<T> extends Foo<T> { 
    public Class<?> getParameterClass() { 
     return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]); 
    } 
} 


public static void main(String[] args) { 
    System.out.println(new Bar().getParameterClass()); 
    System.out.println(new Bar2<Object>().getParameterClass()); 
} 

Tatsächlich wird die zweite println eine Ausnahme verursachen.

+0

Gibt es eine Möglichkeit, die zweite zu beheben? – Freewind

+2

es ist eine TypeVariable (also nicht zur Klasse castable) und enthält T (wie in String nicht Klasse), die genau nichts sinnvolles sagt. – durilka

+1

Das Beispiel in der ursprünglichen Post deklariert T nicht als Parameter. So geschrieben muss T eine Klasse sein ... – tkr

3

Dieser Code funktioniert für abgeleitete Klassen auch:

import java.lang.reflect.ParameterizedType; 

public abstract class A<B> 
{ 
    public Class<B> getClassOfB() throws Exception 
    { 
     ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass(); 

     return (Class<B>) superclass.getActualTypeArguments()[0]; 
    } 
} 

von hier verhakt: https://stackoverflow.com/a/4699117/26510

Verwandte Themen