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.
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.
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!
To da zadeklarowany typ parametru - ale wygląda na to, że tak właśnie jest. –
+1, zawsze zabawnie się uczyć wiedziałem, nawet jeśli trzeba się mylić, aby to zrobić. – JaredPar
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
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:
Jest źle można zadzwonić 'Class .getGenericInterfaces() 'i uzyskaj argumenty typu z' ParameterizedType' – ChssPly76
Zgadzam się Zobacz moją odpowiedź, która jest kodem, którego faktycznie używam w generycznym DAO Hibernate, który napisałem. – SingleShot
@SingleShot, @ ChssPly76, miło wiedzieć, że jest to możliwe. zaktualizowałem moją odpowiedź, aby wskazać na odpowiedź @ SingleShot: – JaredPar
[edytuj] Ok, podobno częściowo możliwe. Dobre wyjaśnienie, jak to zrobić (w tym ulepszenie metody opublikowanej przez SingleShot): http://www.artima.com/weblogs/viewpost.jsp?thread=208860
, która powinna prawdopodobnie przeczytać 'Class
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;
}
}
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() {...} ...}
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);
}
}
skąd ty próbuje je odzyskać –