查看: 2220| 回复: 8
跳转到指定楼层
上一主题 下一主题
收起左侧

[学Java/C#] List是抽象类吗?

头像被屏蔽
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:药厂工作remote的可能性有多大,统计
下一篇:新冠疫情,后刷题时代来临?
推荐
zqyzdsjdy 2020-5-18 07:50:54 | 只看该作者
全局:
看LZ的发帖纪录,真的是把这当stack overflow来用了啊。。几乎所有你问的问题google下,前几个网页随便点开个都可以解决
回复

使用道具 举报

推荐
orca 2020-5-18 08:08:12 | 只看该作者
全局:
本帖最后由 orca 于 2020-5-18 08:10 编辑
比如,这样去初始化是错的,为什么? List<Integer> a = new List<Integer>();

List 是個 interface, 他沒有 constructor, 所以不能用 new List<Integer>() 來 instantiate 一個新的 List object.
附上 List 的 javadoc: https://docs.oracle.com/javase/8/docs/api/java/util/List.html

如果是错的,为何List<List<Integer>> pathsList = new ArrayList<List<Integer>>(); 是对的?

new ArrayList<List<Integer>>() 沒有問題, 因為你正在 call ArrayList 的 constructor (ArrayList 是一個 concrete class, 有 constructor, 所以這樣寫可行).

在 Java 裡 <> (又稱為 diamond) 裏頭的 "List<Integer>" 是個 parameterized type. 為什麼需要他? 因為舊的 compiler 不夠聰明, 他沒辦法自行 figure out 你想生成的 ArrayList 裡面可以存取的 objects 是什麼 type.

現在新的 Java compiler 變聰明了, 你可以直接省略等號右邊 constructor <> 裡的 parameterized type, 他會依照等號左邊的 type 自行推斷右邊的 type 是哪一種, 這叫做 type inference. 省略過後, 你的代碼就可以這樣寫了: List<List<Integer>> pathsList = new ArrayList<>() 他會直接推斷出你等號右邊的 constructor 是 new ArrayList<List<Integer>>()

這邊有對 <> 的介紹: https://www.baeldung.com/java-diamond-operator

ArrayList<List<Integer>>() 为何不是  ArrayList<ArrayList<Integer>>();

這樣寫其實也對, 上面提到 <> 裡代表的是 parameterized type, 那 new ArrayList<ArrayList<Integer>>() 的意思是告訴 Java compiler 你生成的 ArrayList 只能存取 "ArrayList of Integer" objects 而不是更抽象的任何一種 List 都行.

以下兩種寫法, 哪種比較好?
  • List<ArrayList<Integer>> firstList = new ArrayList<ArrayList<Integer>>();
  • List<List<Integer>> secondList = new ArrayList<List<Integer>>();
現在網上和新書裡大概會推薦後者, 原因是你的 code 可以更 flexible, 無論是 ArrayList<Integer>, LinkedList<Integer>, 或是其他種 List implementation 都可以被放到 secondList 裡. 而第一種就比較 specific 了, 只能存取 ArrayList<Integer>.

這邊有對為什麼建議用 generics 的介紹: https://docs.oracle.com/javase/tutorial/java/generics/why.html

回复

使用道具 举报

🔗
OJASHAHAHA 2020-5-18 07:32:05 | 只看该作者
全局:
这样去初始化是错的,为什么? List<Integer> a = new List<Integer>();

Java List是Interface, 不能通过constructor来初始化

为何List<List<Integer>> pathsList = new ArrayList<List<Integer>>(); 是对的?

因为这里你只通过constructor初始化了最外层的List为ArrayList, 里面那层List并没有被初始化,所以等号右边里面那层可以写List

ArrayList<List<Integer>>() 为何不是  ArrayList<ArrayList<Integer>>();

你想这样子初始化也是可以的
回复

使用道具 举报

🔗
wareag1e 2020-5-18 07:58:34 | 只看该作者
全局:
建议楼主可以看一下"Data Structures and Algorithm Analysis in Java by Mark Allen Weiss"这本书的第三章。
里面讲到了ADT,以及Java类库里面几个常见ADT的实现原理,比如Collection里面的List、Stack、Queue这些。对于后面理解如何使用这些ADT以及如何实现其他ADT都有非常大的帮助。

你问的这几个问题,既涉及到了OOP的特点,也涉及到了Java的一些语法。建议先研究一下class、abstract class、interface这几者的关系。
可以直接看上面我推荐的书的第三章看。里面哪个地方没看明白,就从那个地方开始,在网上查明白。这个基础对后面的java的编码有很大影响。

希望对你有用。
回复

使用道具 举报

🔗
jir1996 2020-5-18 08:31:09 | 只看该作者
全局:
LZ在某群里也问过同样的问题,这些在stack overflow里找找就可以了吧
回复

使用道具 举报

全局:
List本身是接口啊,没办法实例化
回复

使用道具 举报

🔗
小牧 2020-5-19 16:25:11 | 只看该作者
全局:
在java里, List是interface. <>里面的是generics,generics的意思是type is paramater。 所以 List<List<Integer>> list = new ArrayList<List<Integer>>() 现在java版本等同于 List<List<Integer>> list = new ArrayList<>(), 而不能写成List<List<Integer>> list = new ArrayList<ArrayList<Integer>>()
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表