Czy istnieje sposób określenia, czy obiekt jest instancją typu ogólnego?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
To oczywiście nie działa. Czy jest alternatywa? Tak jak chcę użyć odbicia Java, aby utworzyć wystąpienie klasy, a następnie sprawdzić, czy jest to typ ogólny T
.
java
generics
instanceof
Nikordaris
źródło
źródło
type
jako parametru metody, być może chcesz go zainicjalizować:Class type = ((T) new Object()).getClass();
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Aby rozszerzyć próbkę Marka Petersa, często chcesz zrobić coś takiego:
Class<T> type; //maybe passed to the method if ( type.isInstance(obj) ) { T t = type.cast(obj); // ... }
źródło
Jeśli nie chcesz przekazywać typu klasy jako parametru, o czym wspomniał Mark Peters, możesz użyć następującego kodu. Uznanie dla Davida O'Meary.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; if (type.isInstance(obj)) { ... }
źródło
Type safety: Unchecked cast from Type to Class<T>
Możesz tego spróbować
// Cast your object to the generic type. T data = null; try { data = (T) obj; } catch (ClassCastException cce) { // Log the error. } // Check if the cast completed successfully. if(data != null) { // whatever.... }
źródło
Bardziej sensowne byłoby nałożenie ograniczenia na to, gdzie typ
T
jest używany do parametryzacjiClass
typu. Kiedy podajesz typ, zamiast używać czegoś takiegoClass<?>
, powinieneś użyćClass<? extends T>
.źródło
To zadziała (częściowo) tylko wtedy, gdy masz obiekt typu T. Następnie możesz uzyskać klasę tego obiektu, zobaczyć
java.lang.Class<T>
i sprawdzić, czy jest taka sama jak przedmiot, o którym mowa.Ale zauważ, że jest to sprzeczne z samym powodem, dla którego mamy genetyki: używanie typu ogólnego jest sposobem na powiedzenie, że nie obchodzi cię, jaki to naprawdę typ (do górnej i dolnej granicy, którą można określić).
źródło