Две стороны должны совпадать для внутреннего List
:
List<List<?>> foo = new ArrayList<List<?>>();
foo.add(new ArrayList<Integer>());
Хотя это довольно глупо, так как вы только что определили список «списков, которые могут содержать что угодно», и если вы точно не знаете, что каждый из них находится в этом внешнем списке, нет способа его предугадать позже из-за стирания типа.