Почему instanceof не работает с Generic?

Возможный дубликат:
Java: Instanceof и Generics

Я пытаюсь написать функцию, которая приводит общий список к определенному типу List. Найдите код ниже

public <T>List<T> castCollection(List srcList, Class<T> clas){
    List<T> list =new ArrayList<T>();
    for (Object obj : srcList) {
       if(obj instanceof T){
            ...
       }
    }
    return list;
}

Но obj instanceof T показывает ошибку компиляции -

Невозможно выполнить проверку экземпляра с параметром типа T. Вместо этого используйте Object erasure > , так как дополнительная информация типа будет удалена во время выполнения.

любое разъяснение или способ получить желаемый результат?

Спасибо заранее.:)

Ответы

Ответ 1

Вы не можете этого сделать. К счастью, у вас уже есть аргумент Class<T>, поэтому вместо этого

myClass.isAssignableFrom(obj.getClass())

Это вернет true, если obj имеет класс myClass или подкласс.

Как отметил @ILMTitan (спасибо), вам нужно проверить obj == null, чтобы избежать потенциального исключения NullPointerException или вместо этого использовать myClass.isInstance(obj). Либо делает то, что вам нужно.

Ответ 2

Короткий ответ: потому что параметр типа в Java - это то, что просто используется компилятором для обеспечения безопасности типа.

Во время выполнения введите информацию об общих типах, которые будут удалены из-за стирания типа, но instanceof - это проверка времени выполнения, для которой требуется конкретный тип (а не переменная типа).

Ответ 3

T является параметризованным типом и существует для целей компиляции. Это не существует во время выполнения из-за стирания стилей.

Следовательно, obj instanceof T не является законным.

Ответ 4

Поскольку java использует стирание, общие типы не могут использоваться для проверки.

Чтобы получить желаемый результат, используйте Class.isInstance().

Ответ 5

Общие типы удаляются после компиляции (общие для безопасности типа времени компиляции) и будут заменены наиболее применимым типом после компиляции.

Если вы хотите сделать эту компиляцию, замените T на конкретный тип, например

obj instance String