instanceof не работает? - PullRequest
0 голосов
/ 26 мая 2011

Я пытаюсь создать класс, который реализует коллекцию, поэтому он должен иметь метод, который удаляет Object, поэтому я решил, что просто повторно использую метод, который я уже создал, чтобы удалить объект универсального типаT, но выдает ошибку времени компиляции.Почему это не сработает?

Код


public class ArrayPP<T> implements Collection<T>
{
  public boolean remove(Object o)
  {
    if (o instanceof T)
      remove((T)o, true);
    else
      return false;
    return true;
  }
}

Ошибка


ArrayPP.java:5: unexpected type
found   : T
required: class or array
    if (o instanceof T)

Почему, Java?


Я решил это с помощью

if (t.getClass().isInstance(o))
  remove((T)o, true);
else
  return false;
return true;

Но ... Я имею в виду, если кто-то кодирует "ArrayPP<String> a = new ArrayPP<String>();", вы знаете, что T - это String, верно?Так почему же во время выполнения не видно, является ли o String?Я имею в виду, что если бы я сделал a.add('c');, он бы не скомпилировался, потому что он знает, что здесь метод add(T item) в ArrayPP будет принимать только String s, так почему ... тьфу ....

Ответы [ 4 ]

4 голосов
/ 26 мая 2011

Для удаления вам не нужно проверять тип.Если тип не совпадает, его там не будет, и remove в любом случае вернет false.

Если вам нужна динамическая проверка add (T t), вам нужно сохранить тип в поле.

private final Class<T> tClass;

public boolean add(T t) {
   return tClass.isInstanceof(t) && collection.add(t);
}

Вы смотрели на Checked Collection в утилите Collections.Это может делать то, что вы хотите.http://download.oracle.com/javase/6/docs/api/java/util/Collections.html под проверенным набором, проверенным списком, проверенным набором, проверенной картой

3 голосов
/ 26 мая 2011

Нельзя использовать instanceof для универсальных типов параметров.Это потому, что во время выполнения не сохраняется информация о T.

Вы должны прочитать некоторые учебные пособия / документы по дженерикам.Этот случай обычно объясняется в большинстве учебных пособий.

2 голосов
/ 26 мая 2011

T - это параметр общего типа.Информация общего типа стирается во время выполнения.Таким образом, вы не можете проверить, является ли объект экземпляром T.

2 голосов
/ 26 мая 2011

instanceof нельзя использовать с универсальными типами из-за стирания типа - во время выполнения нет T.

Поскольку T не существует во время выполнения, что должен делать instanceof T? Что должен instanceof делать, когда o равен null?

Одно неприятное занятие - использовать getClass() и принимать решение на его основе.

Удачного кодирования.

...