Подтвердить что ты не робот

Проверьте, является ли объект экземпляром типа параметра

Есть ли способ определить, является ли объект экземпляром универсального типа?

public <T> test(Object obj) {
    if (obj instanceof T) {
        ...
    }
}

Это явно не работает. Есть ли альтернатива? Как я хочу использовать отражение Java, чтобы создать экземпляр класса, а затем проверить, чтобы убедиться, что он имеет тип generic T

4b9b3361

Ответ 1

Единственный способ выполнить эту проверку - если у вас есть объект Class, представляющий тип:

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

Ответ 2

Чтобы расширить образец Mark Peters, часто вы хотите сделать что-то вроде:

Class<T> type; //maybe passed to the method
if ( type.isInstance(obj) ) {
   T t = type.cast(obj);
   // ...
}

Ответ 3

Вы можете попробовать это,

// 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....
}

Ответ 4

Если вы не хотите передавать тип Class в качестве параметра, упомянутого Марком Петерсом, вы можете использовать следующий код. Престижность Дэвиду О'Миаре.

  Class<T> type = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass())
                  .getActualTypeArguments()[0];
  if (type.isInstance(obj)) {
      ...
  }

Ответ 5

Было бы разумнее поставить ограничение на то, где тип T используется для параметризации типа Class. Когда вы передаете тип, вместо того, чтобы использовать что-то вроде Class<?>, вы должны использовать Class<? extends T>.

Ответ 6

Это будет работать (частично), если у вас есть объект типа T. Затем вы можете получить класс этого объекта, см. java.lang.Class<T> и найти, совпадает ли он с данным объектом.

Но обратите внимание, что это противоречит самой причине, по которой у нас есть следующие жанры: использование универсального типа - это способ сказать, что вам все равно, какой тип он есть (до верхних и нижних границ, которые могут быть указаны).

Ответ 7

Это тоже работает

public <T> void functionName(T input){
    Foo foo = new Foo(); // one of the expected objects
    if(input.getClass().isInstance(foo){
       doSomeThingWith((Foo)input);
    }
}

Завершите демонстрацию Live демо на repl.it