以下声明指定了哪种数据结构?
List[] myArray;
我认为它应该声明一个数组,其中每个元素是一个List
(例如,一个LinkedList
或一个ArrayList
),并要求每个元素List
包含ArrayList
对象.
我的推理:
ListsomeList; // A List of String objects List someList; // A List of ArrayList objects List [] someListArray; // An array of List of ArrayList objects
在运行一些测试之后,我确定它接受一个数组,其中每个元素都是一个LinkedList
对象,并没有指定LinkedList对象包含的内容.
因此,List
指定List
必须包含的内容,但List
指定List
必须如何实现.
我错过了什么吗?
这是我的测试.
import java.util.ArrayList; import java.util.List; import java.util.LinkedList; public class Generics1 { public static void main(String[] args) { List[] 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; } }
Alex Miller.. 17
答案是数组只能保存有效类型.并且一般化的课程没有具体化.也就是说,List
所以这:
List[] myArray
真正意思:
List[] myArray
没有类型安全的方法来声明您要声明的内容.通常,在这种情况下,我建议您使用List而不是数组.有些人甚至建议在我们有泛型的情况下将数组视为已弃用的类型.我不能说我愿意走那么远但你应该考虑一个集合是否是一个更好的选择,只要你被一个数组所吸引.
Naftalin和Wadler的Java Generics and Collections一书是您对泛型问题的极好参考.或者,当然,泛型常见问题解答是您的规范在线参考.
答案是数组只能保存有效类型.并且一般化的课程没有具体化.也就是说,List
所以这:
List[] myArray
真正意思:
List[] myArray
没有类型安全的方法来声明您要声明的内容.通常,在这种情况下,我建议您使用List而不是数组.有些人甚至建议在我们有泛型的情况下将数组视为已弃用的类型.我不能说我愿意走那么远但你应该考虑一个集合是否是一个更好的选择,只要你被一个数组所吸引.
Naftalin和Wadler的Java Generics and Collections一书是您对泛型问题的极好参考.或者,当然,泛型常见问题解答是您的规范在线参考.
Josh Bloch先生说:
"首选列表到数组,因为数组是协变的,而泛型是不变的'
你也许可以这样做:
List> someListArray;
这可能会给性能带来一些打击(甚至不值得我注意),但是在编译时你会获得更好的类型安全性.
但我认为问题应该更多地围绕"为什么"你需要这个?
List[] someListArray;
给你一个:
array of ( List of ArrayList )
但由于Java泛型的限制(错误6229728),您只能实际创建:
array of List
投下它:
List[] someListArray = (List []) new List[5];