Testen Sie, ob das Objekt eine Instanz eines Parametertyps ist

Lesezeit: 2 Minuten

Benutzer-Avatar
Nikordaris

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 geht eindeutig nicht. Gibt es eine Alternative? Wie ich Java-Reflektion verwenden möchte, um eine Klasse zu instanziieren und dann zu überprüfen, ob sie vom Typ generisch ist T.

Sie können diese Überprüfung nur durchführen, wenn Sie die haben Class Objekt, das den Typ darstellt:

Class<T> type; //maybe passed into the method
if ( type.isInstance(obj) ) {
   //...
}

  • Wenn Sie nicht wollen type als Methodenparameter, vielleicht möchten Sie ihn initialisieren: Class type = ((T) new Object()).getClass();

    – JordiVilaplana

    14. Januar 2016 um 0:18 Uhr

  • @JordiVilaplana Das ist nicht richtig, es gibt Ihnen java.lang.Object als Klasse. Sieh dir das an: ideone.com/bxt9Jq

    – Sri Harsha Chilakapati

    13. April 2016 um 8:55 Uhr

  • Verwenden: Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];

    – Ton Snoei

    2. Februar 2018 um 7:58 Uhr


Benutzer-Avatar
Puce

Um das Beispiel 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);
   // ...
}

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)) {
      ...
  }

  • Es gibt Type safety: Unchecked cast from Type to Class<T>

    – Marco Sulla

    25. April 2019 um 19:53 Uhr

Benutzer-Avatar
Georgios Syngouroglou

Du könntest das 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....
}

Sinnvoller wäre es, die Einschränkung auf den Typ zu setzen T dient zur Parametrierung der Class Typ. Wenn Sie die Eingabe übergeben, anstatt etwas wie zu verwenden Class<?>du solltest benutzen Class<? extends T>.

  • Wenn Sie den genauen Typ von T zur Laufzeit wissen möchten, ist es wichtig, dass der Aufrufer eine Class und keine Class. Zum Beispiel würde Puces Code nicht mit Class.

    – Theodor Murdock

    21. Mai 2014 um 20:38 Uhr

Benutzer-Avatar
Ingo

Dies funktioniert nur (teilweise), wenn Sie ein Objekt vom Typ T haben. Dann können Sie die Klasse dieses Objekts abrufen, siehe java.lang.Class<T> und finden Sie heraus, ob es dasselbe ist wie das fragliche Objekt.

Beachten Sie jedoch, dass dies dem eigentlichen 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 wirklich handelt (bis auf Ober- und Untergrenzen, die angegeben werden können).

  • Wenn Sie den genauen Typ von T zur Laufzeit wissen möchten, ist es wichtig, dass der Aufrufer eine Class und keine Class. Zum Beispiel würde Puces Code nicht mit Class.

    – Theodor Murdock

    21. Mai 2014 um 20:38 Uhr

1283680cookie-checkTesten Sie, ob das Objekt eine Instanz eines Parametertyps ist

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy