2010-05-10 11 views
21

¿Hay una manera de obtener el objeto de clase de la variable de tipo en Java clase genérica? Algo así:Java objeto de clase de variable de tipo

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

Este tipo de información está disponible en tiempo de compilación y por lo tanto no debe verse afectada por el tipo de borrado, por lo que, en teoría, debería haber una manera de lograr esto. ¿Existe?

+2

En caso de que su declaración de ser realmente clase pública se extiende Bar Foo {... ?? – Kilokahn

Respuesta

25

Esto funciona:

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

-1. Simplemente no puede. http://java.sun.com/docs/books/tutorial/java/generics/erasure.html – Roman

+4

@Roman ¿No puede? Simplemente pruébalo. Bajar votos sin hacerlo mientras insiste en su respuesta incorrecta es ridículo de todos modos. – sfussenegger

+0

@Roman: simplemente puede. ¿Por qué no lo intentas por ti mismo? –

6

El fragmento de código es un poco confuso. ¿Es T un parámetro de tipo o una clase?

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()); 
} 

En realidad, la segunda impresión causará una excepción.

+0

¿Hay alguna manera de arreglar el segundo? – Freewind

+2

es un TypeVariable (por lo tanto, no convertible a Class) y contiene T (como en string, no class) que no dice exactamente nada útil. – durilka

+1

El ejemplo en la publicación original no declara T como parámetro. Escrito así T debe ser una clase ... – tkr

3

Este código funciona para las clases derivadas, así:

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]; 
    } 
} 

enganchó desde aquí: https://stackoverflow.com/a/4699117/26510

Cuestiones relacionadas