Gibt es eine Möglichkeit festzustellen, ob ein Objekt eine Instanz eines generischen Typs ist?
public <T> test(Object obj) {
if (obj instanceof T) {
...
}
}
Das funktioniert eindeutig nicht. Gibt es eine Alternative? Als ob ich Java Reflection verwenden möchte, um eine Klasse zu instanziieren und dann zu überprüfen, ob sie vom Typ generic ist T
.
java
generics
instanceof
Nikordaris
quelle
quelle
type
als Methodenparameter erhalten möchten, möchten Sie ihn möglicherweise initialisieren:Class type = ((T) new Object()).getClass();
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
Um die Stichprobe von Mark Peters zu erweitern, möchten Sie häufig Folgendes tun:
Class<T> type; //maybe passed to the method if ( type.isInstance(obj) ) { T t = type.cast(obj); // ... }
quelle
Wenn Sie den Klassentyp nicht wie von Mark Peters erwähnt als Parameter übergeben möchten, können Sie den folgenden Code verwenden. Ein großes Lob an David O'Meara.
Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()) .getActualTypeArguments()[0]; if (type.isInstance(obj)) { ... }
quelle
Type safety: Unchecked cast from Type to Class<T>
Sie könnten dies versuchen,
// 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.... }
quelle
Es wäre sinnvoller, die Einschränkung festzulegen, wo der Typ
T
zur Parametrisierung desClass
Typs verwendet wird. Wenn Sie den Typ übergebenClass<?>
, sollten Sie ihn verwenden , anstatt so etwas zu verwendenClass<? extends T>
.quelle
Dies funktioniert nur (teilweise), wenn Sie ein Objekt vom Typ T haben. Dann können Sie die Klasse dieses Objekts abrufen, sehen
java.lang.Class<T>
und herausfinden, ob es mit dem betreffenden Objekt identisch ist.Beachten Sie jedoch, dass dies genau dem Grund widerspricht, warum wir Genrics haben: Die Verwendung eines generischen Typs ist eine Möglichkeit zu sagen, dass es Ihnen egal ist, um welchen Typ es sich tatsächlich handelt (bis zu den oberen und unteren Grenzen, die angegeben werden können).
quelle