数组的 Java 泛型语法

标签 java generics syntax types

下面的声明指定了什么数据结构?

 List<ArrayList>[] myArray;

我认为它应该声明一个数组,其中每个元素都是一个 List (例如 LinkedListArrayList )并要求每个 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。泛型在运行时被删除(谷歌“删除之墙”了解更多信息)。

所以这样:

List<ArrayList>[] myArray

真正的意思是:

List[] myArray

没有类型安全的方法来声明您要声明的内容。通常,在这种情况下,我建议您使用列表而不是数组。有些人甚至建议既然我们有了泛型,就应该将数组视为不推荐使用的类型。我不能说我愿意走那么远,但当您被吸引到数组时,您应该考虑集合是否是更好的选择。

本书Java Generics and Collections Naftalin 和 Wadler 的著作对于您可能对泛型有疑问是一个很好的引用。或者,当然,Generics FAQ是您的规范在线引用。

关于数组的 Java 泛型语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/185594/

相关文章:

java - 在方法中使用单个临时变量有好处吗?

C# 泛型未按预期工作

java - 错误: Invalid start tag LinearLayout

java - 反序列化集合时不安全的泛型转换

ios - 接受类型序列的函数

java - 使用泛型来简化调用

javascript - '=' 运算符在这种情况下做什么? sqrtf(1 - (t = t/d - 1) * t);

postgresql - 如果满足某些条件,postgres 会计算一条记录两次

ruby - Ruby 读取 "do"和 "end"的方式与读取 "{"和 "}"的方式相同吗?

java - SSO OAuth2Authentication session 和服务器端 http 请求