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

时间: 2024-10-10 21:23:08

ArrayList与List接口如何理解的相关文章

接口的理解

这个是自己的理解,因为我也是刚开始编程的菜鸟,所以会有很多错误,欢迎大家指导! 首先按我的理解来说一个例子(这个例子被很多人提过,下面的这个是按我自己的理解来说的): 小王是一个苦逼(酷毙)程序员,他要开发一个程序,其中要实现一个功能:连接到一个数据库,要对数据库进行一些操作.实现功能首先需要有一个数据库,在开发的时候他使用的A厂家的数据库.假设A厂家提供的类库中实现小王需要的功能的类是DataA,小王创建一个DataA实例,然后调用DataA类中的方法.假设DataA类连接数据库的方法为Con

关于Java中继承和接口的理解

关于Java中继承和接口的理解 Java语言中,为了实现代码重用,设计了继承这一机制,但是,其设计成单继承,这样设计是有原因的,如下图: Figure1:deadly diamond of death 此图问题称为菱形问题(diamond problem),就是说,当A的子类B和C同时实现了A中的方法,则同时继承了B和C的子类D在调用该方法时会出现混乱,无法得知该调用哪一个方法. 既然不能实现多继承,我们就会考虑把很多方法就写在父类里,或者继承抽象类,实现其方法,但是,这样会导致一个问题,比如说

【转】C#中对IDisposable接口的理解

IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放托管资源和内存回收的工作,但它无法对非托管资源进行释放,这时我们必须自己提供方法来释放对象内分配的非托管资源,比如你在对象的实现代码中使用了一个COM对象 最简单的办法可以通过实现Finalize()来释放非托管资源,因为GC在释放对象时会检查该对象是否实现了 Finalize() 方法. 有一种更好的,那就是通过实现一个接口显式的提供给客户

C#中对IDisposable接口的理解

http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html 本人最近接触一个项目,在这个项目里面看到很多类实现了IDisposable接口.在我以前的项目中都很少用过这个接口,只知道它是用来手动释放资源的.这么多地方用应该有它的好处,为此自己想对它有进一步的了解,但这个过程远没有我想象中的简单. IDisposable接口定义:定义一种释放分配的资源的方法. .NET 平台在内存管理方面提供了GC(Garbage Collection),负责自动释放

tair中对get/get_range接口的理解及为get_range添加命令行测试接口

经过这段时间对淘宝开源K/V缓存系统tair基础接口put/get/get_range等源码的详细剖析后,按自己的理解简单总结下tair中我较关心的get和get_range这两个接口的基本实现流程.由于get_range接口是最新几个版本才加入的功能,因此以前的tair Java客户端及最新版本安装后的命令行测试中都没有加入get_range测试接口,这无疑给需要专门优化get_range接口的我带来了不便,因此本文最后给出了在tair中实现get_range命令行测试的方法和示例. 1 ta

利用接口去理解委托

开始使用C#中的委托时,有时会很难理解它的真正的含义,在使用时就会感觉不知道怎么使用它,其实最主要的还是不大明白它的机制, 或者说它的使用场景,首先解释下委托,字面意思就知道它就是一个代理,一个委托,它是谁的代理呢,方法的代理.看下面的代码: 上面的代码就是定义一个委托来表示一类方法,使用一个字符串参数并无返回的一个方法, 只要满足这种签名的方法都可以用PrintLine委托实现方法的间接调用.下面自定义一个委托,结果是一样的,但是调用的方法不一样. 至于委托的底层实现, 可以参考FrameWo

JAVA回调接口的理解

A类持有B接口的对象引用,B接口有一个callBack()方法,C类是B类的实现类,实现了callBack()方法,把C类传入A类,当A类执行完操作后调用callBack()方法,这时候A调用的就是C类callBack()方法,相当于通知了C“我的操作完成了”,我们只要在C类的callBack()方法写处理就可以了,这就是回调.理解不难,多写写就可以了! 1 public interface B { 2 public void cllBack(String result); 3 } 4 publ

个人对interface接口的理解

一句话"类是对象的抽象,接口抽得更厉害,是类的抽象",那这句话是什么意思呢?也就是类中包括很多其他的对象,是对象的一个集合,而这些对象就是类的属性或方法:而接口则包括许多类,但是他和类又有着不同.试想如果"接口"是要把类放到"接口"中,那么所谓的"接口"实际上就是一个类了.所以接口绝不是把类放到内部去:那么我们就要理解"接口"的含义,接口在现实中就是插座的意思,而插座是有两面的,一面是给插头的插孔,另一面是

接口深层理解

JAVA 接口理解 .txt27 信念的力量在于即使身处逆境, 亦能帮助你鼓起前进的船帆: 信念的魅 力在于即使遇到险运,亦能召唤你鼓起生活的勇气:信念的伟大在于即使遭遇不幸,亦能促 使你保持崇高的心灵. java 接口实现 对初学者来说,接口不是很好理解.现将某高手的一篇文章贴出来,共大家分享! 我们来看一个类 class A { private int a; public int getA() { return a; } } 这个类的属性是私有的,外界不能访问,而外界可以通过公有方法来访问这