Дело в том, что объект знает свой конкретный класс, но не аргументы общего типа для этого. Поэтому, если мы построим ArrayList<Integer>
, который знает во время выполнения, что это ArrayList
из некоторого рода, но он не знает о части Integer
.
«ArrayList
какой-то« части »- это именно то, что означает ArrayList<?>
, поэтому:
if (foo instanceof ArrayList<?>)
действительно. Это просто эквивалентно использованию необработанного типа:
if (foo instanceof ArrayList)