2009-11-03 20 views
6
public Interface Foo<T extends Colors>{...} 

Czy istnieje sposób na odzyskanie tego, które podano dla implementacji Foo?Jawne generics - pobierz typ

Na przykład

public Class FooImpl implements Foo<Green>{..} 

Wrócimy Green.

+0

skąd ty próbuje je odzyskać –

Odpowiedz

15

W przeciwieństwie do innych odpowiedzi, można uzyskać typ parametru ogólnego. Na przykład dodanie tego sposobu wewnątrz ogólnej klasie otrzyma pierwszy ogólny parametr klasy (T w Twoim przypadku):

ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); 
type.getActualTypeArguments()[0] 

używam tej techniki w ogólnej hibernacji DAO pisałem więc mogę uzyskać faktyczna klasa jest utrzymywana, ponieważ jest potrzebna przez Hibernate. To działa!

+0

To da zadeklarowany typ parametru - ale wygląda na to, że tak właśnie jest. –

+1

+1, zawsze zabawnie się uczyć wiedziałem, nawet jeśli trzeba się mylić, aby to zrobić. – JaredPar

+0

Dzięki za kontynuację tego. Myślałem, że odpowiedzią było to, co powiedział @JaredPar, zanim nawet zadałem to pytanie, więc myślę, że byłem trochę zbyt szybki w zaakceptowaniu tego! – tinkertime

9

EDIT

Okazuje się, że w tym przypadku możliwe jest, aby uzyskać informacje ogólne. Singleshot opublikował answer, który właśnie to robi. Jego odpowiedź powinna być zaakceptowana. Przekwalifikowanie moje.

Ogólnie rzecz biorąc, istnieje wiele przypadków, w których nie można uzyskać informacji o typie, których można się spodziewać. Java używa techniki o nazwie typ wymazania, która usuwa typy z ogólnej wersji podczas kompilacji. Zapobiega to uzyskiwaniu informacji o ich rzeczywistym wiązaniu w środowisku wykonawczym w wielu scenariuszach.

Nicea FAQ na temat:

+0

Jest źle można zadzwonić 'Class .getGenericInterfaces() 'i uzyskaj argumenty typu z' ParameterizedType' – ChssPly76

+0

Zgadzam się Zobacz moją odpowiedź, która jest kodem, którego faktycznie używam w generycznym DAO Hibernate, który napisałem. – SingleShot

+0

@SingleShot, @ ChssPly76, miło wiedzieć, że jest to możliwe. zaktualizowałem moją odpowiedź, aby wskazać na odpowiedź @ SingleShot: – JaredPar

0

Jednym ze sposobów na to jest jawne przekazanie obiektu klasy wraz z typem. Coś jak poniżej:

public class FooImpl<T extends Colors> { 
    private Class<T> colorClass; 
    public FooImpl(T colorClass) { 
    this.colorClass = colorClass; 
    } 
    public Class<T> getColorClass() { 
    return colorClass; 
    } 
} 
0

Zależy od tego, co masz na myśli. Wystarczy T może być to, co chcesz, na przykład:

public Interface Foo<T extends Colors>{ public T returnType() {...} ...} 
1

Jest. Spójrz na [Javadoc dla java.lang.Class # getGenericInterfaces()] (http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Class.html#getGenericInterfaces())

tak:.?.

public class Test1 { 

    interface GenericOne<T> { 
    } 

    public class Impl implements GenericOne<Long> { 
    } 

    public static void main(String[] argv) { 
     Class c = (Class) ((ParameterizedType) Impl.class.getGenericInterfaces()[0]).getActualTypeArguments()[0]; 
     System.out.println(c); 
    } 
}