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

Java: instanceof Generic

Нет ли способа найти класс-тип общего?

if (T instanceof String) {
    // do something...
}

Вышеуказанное не компилируется.

4b9b3361

Ответ 1

Generics - это функция времени компиляции. Generics добавляет проверки во время компиляции, которые могут не иметь никакого значения во время выполнения. Это один из примеров. Вы можете проверить только тип объекта, который может быть супер-типом в коде. Если вы хотите передать тип T, вы сделаете это явно.

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

или

void someMethod(Class<T> tClass, T tArg) {

Примечание: тип может быть не таким,

someMethod(Number.class, 1);

Ответ 2

если у вас есть подкласс

public class SomeClass extends SomeSubclass<String>{}

и

public class SomeSubclass<T> {}

то есть способ обнаружить тип T, выполнив код

Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
    Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
    // in simple cases actualTypeArguments will contain Classes, since Class implements Type
}

если ваш случай немного сложнее (? extends String) `взгляните на org.ormunit.entity.AEntityAccessor # extractClass

Ответ 3

Он не будет компилироваться, потому что T не является переменной, а владельцем места для класса, который определен во время выполнения. Вот пример:

public class Test<T> {

public void something(T arg) {
    if (arg instanceof String) {
        System.out.println("Woot!");
    }
}

public static void main(String[] args) {
    Test<String> t = new Test<String>();
    t.something("Hello");
}

}

Ответ 4

Если у вас есть определенное поле, вы можете просто проверить его, как показано ниже:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...