Почему 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