java - 当 foo 由类 ArrayList 而不是接口(interface) List 表示时,使用 foo 不是更容易吗?

标签 java generics oop class interface

我经常看到这种语法,但不明白其背后的原因。我认为您通常希望使用类而不是接口(interface),以便更轻松地执行您可能想要执行的全部操作。

为什么这样做:

List<Foo> foo = new ArrayList<Foo>(something.getFoo());

而不是这个:

ArrayList<Foo> foo = new ArrayList<Foo>(something.getFoo());

当您以后想对 foo 执行操作时?如果 foo 由类 ArrayList 而不是接口(interface) List 表示,不是更容易吗?

最佳答案

偶尔,是的。如果您实际上需要一个在 ArrayList<T> 中声明的方法但不在List<T>那么当然,去吧。

但是,反过来更灵活 - 如果您不需要需要在 ArrayList<T> 中声明的任何方法,那么您的代码可以通过将变量声明为 List<T> 类型来表达这一点反而。也就是说,“我只需要一个列表。我碰巧选择了 ArrayList<T>,但只是因为它的行为适合我……而不是因为我需要它公开的任何额外功能。”

例如,如果以后有人想知道他们是否可以替换不同的实现,这将很有用。它还限制了读者需要考虑的范围……变量的类型越通用,读者能用它做的事情就越少 - 因此需要考虑的就越少。

例如,如果我看到一个 Iterable<T> 类型的变量我知道以后可能用它做的事情很少:基本上,它会被用来迭代,仅此而已。我不需要担心任何后续代码是否会尝试向集合添加值,或通过索引等访问它。

这对于局部变量来说相对不重要,但对于实例变量尤其是参数来说更重要:你的参数越不具体,调用者就越灵活地决定他们将传递哪些参数.

关于java - 当 foo 由类 ArrayList 而不是接口(interface) List 表示时,使用 foo 不是更容易吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3543338/

相关文章:

Java生成随机数字序列并随机访问序列元素

java - java中可以有多个堆吗?

java - 正则表达式匹配字符串列表并忽略字符串列表

java - 为什么没有列表<?扩展 A> 接受扩展 A 的 B 的实现吗?

php - 我可以在另一个类中实例化一个 PHP 类吗?

java - 使用 String.matches() 代替 util Pattern 匹配前两位数字

java - Java 中的泛型阻止方法调用

Java 泛型参数从类泛型到方法泛型的类型不匹配

objective-c - 使用 alloc init 而不是 new

java - Bloch Effective Java - 支持静态类而不是非静态类 - 有多少个实例?