2013-09-04 4 views
1

я собирался Повсеместно этой ссылкойИспользование параметризованного типа для определения типа

Java Generic Class - Determine Type

Я попытался с помощью этой программы.

package my; 

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

public class GenericTypeIdentification { 

    public static void main(String args[]) { 
     Node<Integer> obj = new GenericTypeIdentification().new SubNode<Integer>(1); 
     ParameterizedType parameterizedType = (ParameterizedType) obj.getClass().getGenericSuperclass(); 
     Type clazz = parameterizedType.getActualTypeArguments()[0]; 
     if (clazz == Integer.class) { 
      System.out.println(1); 
     } 
     else { 
      System.out.println(2); 
     } 
    } 

    class Node<T> { 

     private final T value; 

     public Node(T val) { 
      this.value = val; 
     } 

     public T evaluate() { 
      return value; 
     }; 

    } 

    class SubNode<T> extends Node<T> { 

     private final T value; 

     public SubNode(T val) { 
      super(val); 
      value = val; 
     } 

     @Override 
     public T evaluate() { 
      return value; 
     }; 
    } 
} 

Мое понимание было то, что он должен printh вывод как 1 но он печатает 2. Пожалуйста, помогите мне в понимании этого. Благодарю.

+0

Из-за стирания типа вы не можете определить общий тип во время выполнения. – mike

ответ

3

Трюк, который фактически работает, используется в google guiceTypeLiteral. В конструкторе подкласса родового класса вы получаете , а имеют доступ к родовому «экземпляру» родительского элемента даже во время выполнения ... потому что информация общего типа была сохранена для целей наследования во время компиляции. Пример использования:

TypeLiteral<MyClass> test = new TypeLiteral<MyClass>() {}; // notice the {} to build an anon. subclass 
System.err.println(test.getType()); // outputs "MyClass" 

Это не работает без использования подклассом в своем-родовое, из-за типа стирания; и, вероятно, слишком много для большинства приложений.

+0

Интересно, я думал, что информация полностью потеряна во время выполнения! – mike

+0

О, это хорошо .. Попробуй это .. спасибо – LPD

1

В этом случае Clazz будет T.

Дженерики рассматриваются только во время компиляции в java. Вы можете попытаться определить значение параметра типа коллекции во время выполнения, просмотрев классы своих членов (без 100% -ной уверенности, вы можете получить подкласс ...). Невозможно определить значение параметра типа пустой коллекции во время выполнения.

+1

Истина в общем случае, но ложна, когда задействованы иерархии классов - см. Мой ответ выше :-) – tucuxi

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