Ответ 1
В
final ArrayList<?> dp1 = new ArrayList<String>();
Аргумент типа ?
является подстановочным знаком, который является надмножеством (не супер-типом) String
. Итак, ArrayList<?>
является супер-типом ArrayList<String>
.
Но в
final ArrayList<ArrayList<?>> dp2 = new ArrayList<ArrayList<String>>();
Аргумент типа ArrayList<?>
(параметризованный тип, где ?
просто обозначает некоторый тип unkown и не имеет ничего общего с String
), не является подстановочным знаком, подстановочный знак будет ? extends ArrayList<?>
, с верхней границей ArrayList<?>
, которая на самом деле является супертипом ArrayList<String>
.
Вы можете прочитать о правилах относительно супер /sub set/type в параметризованном типе здесь.