ArrayList<? super IOException>
может быть любым из следующих (так как здесь подстановочный знак):
ArrayList<IOException>
ArrayList<Exception>
ArrayList<Throwable>
ArrayList<Object>
Код должен работать со всеми четырьмя возможностями.
Но если это такArrayList<IOException>
, вы не можете вставить ClassCastException
или Exception
, следовательно, ошибки компиляции.
Вот что я не получаю: почему эта компиляция ------ >>> list.add (new FileNotFoundException ("это нормально."));<<< ---- Я думаю, FileNotFoundException также ниже границы IOException.но компилируется нормально.</p>
Нет, FileNotFoundException - это нормально, поскольку он расширяет IOException, и вы можете поместить его во все четыре типа списков.
Обратите внимание, что по историческим причинам массивы не получаютПри такой же строгой проверке типов вы можете скомпилировать следующее (а затем получить исключение хранилища массивов во время выполнения):
Exception[] a = new IOException[4];
a[0] = new FileNotFoundException("this is ok.");
a[1] = new IOException("This is ok");
a[2] = new ClassCastException("compiles, but boom!");
a[3] = new Exception("compiles, but boom!");