2010-05-10 3 views
21

Есть ли способ получить объект класса из переменной типа в Java-классе? Нечто подобное:Объект класса Java из переменной типа

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

Этот тип информация доступна во время компиляции и, следовательно, не должны быть затронуты типа стирания, поэтому, теоретически, должен быть способ для достижения этой цели. Он существует?

+2

Если ваша декларация действительно общественный класс Bar расширяет Foo {... ?? – Kilokahn

ответ

25

Это работает:

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

-1. Это просто не может. http://java.sun.com/docs/books/tutorial/java/generics/erasure.html – Roman

+4

@Roman Это не может? Просто попробуйте. В любом случае, несмотря на то, что вы настаиваете на своем неправильном ответе, это не смешно. – sfussenegger

+0

@ Roman: Это просто может. Почему бы тебе не попробовать? –

6

Фрагмент кода немного сбивает с толку. Является ли T параметром типа или классом?

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

Фактически второй println вызывает исключение.

+0

Есть ли способ исправить второй? – Freewind

+2

это TypeVariable (таким образом, он не поддается классу) и содержит T (как в строке not class), которая точно не говорит ничего полезного. – durilka

+1

Пример в столбце orignal не объявляет T как параметр. Написанный как этот T должен быть классом ... – tkr

3

Этот код работает для производных классов, а также:

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

зацепил здесь: https://stackoverflow.com/a/4699117/26510

Смежные вопросы