Java - instanceof против Casting универсального класса во время выполнения:

В коде, извлеченном из полной ссылки Java Гербертом Шильдтом:

class Gen<T> {
  T obj;

  Gen(T o) {
    ob = o;
  }

  T getob() {
    return ob; 
  }
}

class Gen2<T> extends Gen<T> {
  Gen2(T o) {
    super(o);
  }
}

class Test {
  public static void main(String args[]) {
    Gen2<Integer> obj = new Gen2<Integer>(99);
  }
}

он упоминает, что instanceof не может проверить, принадлежит ли объект типизированному универсальному классу во время выполнения, потому что нет общей информации:

if (obj instanceof Gen2<Integer>) // illegal, doesn't compile

вы можете использовать только

if (obj instanceof Gen2<?>) // legal

Тем не менее, вы все равно можете привести тот же объект к (Gen), если он совместим:

(Gen<Integer>) obj // legal

но:

(Gen<Long>) obj // illegal

Разве это не противоречие Java? Если Java знает, что obj может быть приведен к Gen во время выполнения, почему он не знает, что obj является экземпляром класса / подкласса Gen?

1 ответ

Я прочитал книгу, смущенный этим тоже, я нашел это, возможно, полезным: https://docs.oracle.com/javase/tutorial/java/generics/restrictions.html

Однако в некоторых случаях компилятор знает, что параметр типа всегда допустим и разрешает приведение. Например:

List<String> list1 = ...;
ArrayList<String> list2 = (ArrayList<String>)list1;  // OK
Другие вопросы по тегам