@HuPu #63 已知是没问题 ,如果你新写一个呢,假如你写的时候没注意写了 testNew(ArrayList list); 如果外边定义使用的 ArrayList al = new ArrayList(); 是不会提示你有问题的 只有等你换 LinkedList 时才会发现要跟着改
如果外边是 List al = new ArrayList(); 定义新方法的时候就会提示你类型不对
passerbytiny
2022-01-20 16:46:16 +08:00
@HuPu #59 “光跑起来的时候能运行还不行,纯看代码也得能逻辑上说得通才行”,这是强类型语言根弱类型语言的显著区别。对于你这一场景,两句语句确实在运行上没区别。但代码逻辑上,一个传的是 List 类型变量,一个传的的 List 的子 /实现类 ArrayList 类型的变量——前者是基类,后者是子类,这个区别是很大的。建议先了解一下“编译时”跟“运行时”,这俩搞明白之后再回头来看就很容易懂了。
public void sth() List{ ArrayList list=new ArrayList; return list } java 是不能这么写么? c#和 golang 我都是这么写的 我觉得在变量声明的时候没有必要面对 interface,只要语言支持里式代换,在出入参处声明就行啊
Edsie
2022-01-20 18:08:29 +08:00
最烦这种,固执的纠结这种无意义的东西,明明怎么用都可以,没有什么最佳实践 用 var 不就行了 把心思用在其他地方吧
johnniang
2022-01-20 18:28:42 +08:00
如果你要是用 ArrayList 独有的方法,这样写没问题。
如果你是用的只是 List 接口里面定义的方法,建议赋值给 List 。
试想一下,未来 JDK 中实现了一种更高效的 List ,你只需要修改实现即可,不需要修改变量的类型,以及修改后可能带来的问题。
uleh
2022-01-20 18:43:26 +08:00
ArrayList al = new ArrayList() 这样写当然也能编译通过,代码执行也不会有太大问题 但是编写代码的时候,并不是代码能 run 就可以的。 首先应该是你对问题的抽象,然后使用代码逻辑来表达这个抽象。 从这个角度上来说,你的思考顺序应该是:我要使用 List 来保存数据。 然后在 Java 的语言系统里,根据需求给 List 找一个实现,比如 ArrayList 或者 LinkedList 。
所以这个并不是“可以不可以”的问题,而是本质上体现了你思考的逻辑和出发点。
ScepterZ
2022-01-20 18:58:31 +08:00
@HuPu 首先,这是一行,两处。 然后,你“只用 list 的功能”这一点,如果你写 List ,是有代码层面强制你这么做的,如果你写 ArrayList ,就只能靠自觉了
Jwyt
2022-01-20 19:12:36 +08:00
@passerbytiny 啥乱七八糟的,都是 List list = new LinkedList() 啊,怎么会直接声明 LinkedList LinkedList 工作中几乎没用到过