После выполнения некоторых дополнительных тестов, я думаю, что у меня есть ответ.
List [] действительно указывает массив, где каждый элемент является списком объектов ArrayList.
Компиляция кода, показанного ниже, показала, почему мой первый тест позволил мне использовать массив, где каждый элемент представляет собой список чего-либо. Использование типов возврата List [] и List в методах, которые заполняют массивы, не предоставило компилятору достаточно информации, чтобы запретить назначения. Но компилятор выдавал предупреждения о неоднозначности.
С точки зрения компилятора, метод, возвращающий List [], может возвращать List (который удовлетворяет объявлению), а может и нет. Точно так же метод, возвращающий List, может или не может возвращать ArrayList.
Здесь был вывод компилятора:
javac Generics2.java -Xlint: не проверено
Generics2.java:12: warning: [unchecked] unchecked conversion
found : java.util.List[]
required: java.util.List<java.util.ArrayList>[]
someListArray = getArrayWhereEachElementIsALinkedListObject();
^
Generics2.java:16: warning: [unchecked] unchecked conversion
found : java.util.List[]
required: java.util.List<java.util.ArrayList>[]
someListArray= getArrayWhereEachElementIsAListOfLinkedListObjects();
Вот мои тесты.
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedList;
public class Generics2 {
public static void main(String[] args) {
List<ArrayList>[] someListArray;
someListArray = getArrayWhereEachElementIsALinkedListObject();
// Why does this satisfy the declaration?
//someListArray[0] => LinkedList object holding Strings
someListArray= getArrayWhereEachElementIsAListOfLinkedListObjects();
//someListArray[0] => LinkedList object holding LinkedList objects
}
public static List[] getArrayWhereEachElementIsALinkedListObject() {
List[] arrayOfLists = new LinkedList[2];
arrayOfLists[0] = getStringLinkedListAsList();
arrayOfLists[1] = getIntegerLinkedListAsList();
return arrayOfLists;
}
public static List[] getArrayWhereEachElementIsAListOfLinkedListObjects() {
List list1 = new LinkedList();
list1.add(new LinkedList());
List list2 = new LinkedList();
list2.add(new LinkedList());
List[] arrayOfListsOfLinkedLists = new LinkedList[2];
arrayOfListsOfLinkedLists[0] = list1;
arrayOfListsOfLinkedLists[1] = list2;
return arrayOfListsOfLinkedLists;
}
public static List getStringLinkedListAsList() {
List stringList= new LinkedList();
stringList.add("one");
stringList.add("two");
return stringList;
}
public static List getIntegerLinkedListAsList() {
List intList= new LinkedList();
intList.add(new Integer(1));
intList.add(new Integer(2));
return intList;
}
}