• ArrayList与List接口如何理解


    正确的写法:

    public static List<List<Integer>> function(){
            List<List<Integer>> list = new ArrayList<List<Integer>>();
            return list;
        }

    错误写法1:

    public static List<List<Integer>> function(){
            List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); //报错
            return list;
        }

    错误写法2:

    public static List<List<Integer>> function(){
            ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); 
            return list;//报错
        }

    有价值的参考答案:

    brayden

    这个和 Arraylist实现, List接口没有关系.

    Effective Java 2nd, item25:

    Generics, by contrast, are invariant: for any two distinct types Type1
    and Type2, List is neither a subtype nor a supertype of
    List [JLS, 4.10; Naftalin07, 2.5].

    为了防止下面的情况:

    // Won't compile!
    List<Object> ol = new ArrayList<Long>(); // Incompatible types
    ol.add("I don't fit in");
    

    针对你的问题:

     List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); //报错
    

    如果按你的逻辑不报错, 那么list里可以放入ArrayList, 也可以放入LinkedList.
    显然违反了类型安全.

    List<List<Integer>> list = new ArrayList<ArrayList<Integer>>(); 
    list.add(new LinkedList<Integer>()); //OOPS!

    cow12331我的理解是泛型中只能代表类型,而不能实例化。List list = new ArrayList() 中的ArrayList 是实例化,List是类型。List<List> list = new ArrayList<List>() 的<>中的是类型。所以List<ArrayList> list = new ArrayList<ArrayList>()也是对的但List<List> list = new ArrayList<ArrayList>()是错的,因为类型不一样了。

    brayden :泛型左右的<>里都是一样的. 实际上在java7之后, 一般都是这样写: List<List<Integer>> list = new ArrayList<>(); 称为Diamond Operator.

    qq118194716

    List<List<Integer>> result= new ArrayList<List<Integer>>();
    List只是泛型接口,里面的也并不是ArrayList,而只是元素是List<Integer>类型的引用而已,被初始化为null
    你赋值时它才知道自己的每个元素引用了一个什么样的List<Integer>的子类

    xueqilinqqq:

    可能我的表述有问题,我的意思是 外层的List我们显式地告诉了它 要引用的是ArrayList型的子类;
    但是对于里层的List<Integer>,并没有明确地声明,照您所说,是等到我赋值的时候程序才知道子类的类型是ArrayList,那举个例子:
    List<List<Integer>> result= new ArrayList<List<Integer>>();
    可以理解为我在里层的List可以存储其他类型比如LinkedList的子类元素吗?

    reference:http://segmentfault.com/q/1010000000626316

    http://bbs.csdn.net/topics/391029212

  • 相关阅读:
    第一章ASP.NET SignalR简介
    第六章SignalR的服务器广播
    第五章SignalR的实时高频通讯
    第四章SignalR自托管主机
    第三章SignalR在线聊天例子
    第二章SignalR所支持的平台
    DevExpress ASPxHtmlEditor控件格式化并导出Word (修复中文字体导出丢失)
    改进的简单Tooltips显示
    C# WebForm 使用NPOI 2 生成简单的word文档(.docx)
    一些自用的小工具,分享给非程序猿们
  • 原文地址:https://www.cnblogs.com/hygeia/p/4703657.html
Copyright © 2020-2023  润新知