我经常看到这种语法,但不明白其背后的原因。我认为您通常希望使用类而不是接口(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/