下面的声明指定了什么数据结构?
List<ArrayList>[] myArray;
我认为它应该声明一个数组,其中每个元素都是一个 List
(例如 LinkedList
或 ArrayList
)并要求每个 List
包含 ArrayList
对象。
我的推理:
List<String> someList; // A List of String objects
List<ArrayList> someList; // A List of ArrayList objects
List<ArrayList>[] someListArray; // An array of List of ArrayList objects
运行一些测试后,我确定它接受一个数组,其中每个元素都是一个 LinkedList
。对象并且不指定 LinkedList 对象包含的内容。
所以 List<ArrayList>
指定 List
是什么必须包含,但是 List<ArrayList>[]
指定如何 List
必须实现。
我错过了什么吗?
这是我的测试。
import java.util.ArrayList;
import java.util.List;
import java.util.LinkedList;
public class Generics1 {
public static void main(String[] args) {
List<ArrayList>[] someListArray;
someListArray = getArrayWhereEachElementIsAnArrayListObject();
// Why does this satisfy the declaration?
//someListArray[0] => ArrayList object holding Strings
someListArray= getArrayWhereEachElementIsAListOfArrayListObjects();
//someListArray[0] => ArrayList object holding ArrayList objects
}
public static List[] getArrayWhereEachElementIsAnArrayListObject() {
List[] arrayOfLists = new ArrayList[2];
arrayOfLists[0] = getStringList();
arrayOfLists[1] = getIntegerList();
return arrayOfLists;
}
public static List[] getArrayWhereEachElementIsAListOfArrayListObjects() {
List list1 = new ArrayList();
list1.add(getArrayList());
List list2 = new ArrayList();
list2.add(getArrayList());
List[] arrayOfListsOfArrayLists = new ArrayList[2];
arrayOfListsOfArrayLists[0] = list1;
arrayOfListsOfArrayLists[1] = list2;
return arrayOfListsOfArrayLists;
}
public static List getStringList() {
List stringList= new ArrayList();
stringList.add("one");
stringList.add("two");
return stringList;
}
public static List getIntegerList() {
List intList= new ArrayList();
intList.add(new Integer(1));
intList.add(new Integer(2));
return intList;
}
public static ArrayList getArrayList() {
ArrayList arrayList = new ArrayList() ;
return arrayList;
}
}
最佳答案
答案是数组只能容纳具体化的类型。并且泛型类没有具体化。也就是说,List
所以这样:
List<ArrayList>[] myArray
真正的意思是:
List[] myArray
没有类型安全的方法来声明您要声明的内容。通常,在这种情况下,我建议您使用列表而不是数组。有些人甚至建议既然我们有了泛型,就应该将数组视为不推荐使用的类型。我不能说我愿意走那么远,但当您被吸引到数组时,您应该考虑集合是否是更好的选择。
本书Java Generics and Collections Naftalin 和 Wadler 的著作对于您可能对泛型有疑问是一个很好的引用。或者,当然,Generics FAQ是您的规范在线引用。
关于数组的 Java 泛型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/185594/