当前位置: 首页 > 面试题库 >

当foo由类ArrayList而不是接口List表示时,使用foo难道不是很容易吗?

杭泉
2023-03-14
问题内容

我经常看到这种语法,并且不了解其背后的原因。我以为您通常希望使用类而不是接口,以便更轻松地执行可能要执行的全部操作。

为什么这样做:

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

代替这个:

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

以后何时要对foo执行操作?如果foo由类ArrayList而不是接口List表示,难道不是很容易吗?


问题答案:

有时候,是的。如果 确实 需要在中声明ArrayList<T>但不在in中声明的方法List<T>,请继续使用它。

但是,相反的做法则更为灵活-如果您 不需要
在中声明任何方法ArrayList<T>,则您的代码可以通过声明变量为类型List<T>来表达这一点。那就是说:“我只需要一个列表。我正好在进行选择ArrayList<T>,但这仅仅是因为它的行为适合我……而不是因为我需要它提供的任何其他功能。”

例如,这有助于了解以后是否有人想知道是否可以替代其他实现。它还限制了读者必须考虑的内容…变量的类型越笼统,对它的处理就越少-因此,人们对它的思考就越少。

例如,如果我看到一个类型为变量的变量,Iterable<T>我知道以后可能很少使用它:基本上,它将用于迭代,仅此而已。我不必担心以后的代码是否会尝试向集合中添加值,或通过索引等访问它。

这对于局部变量 而言相对而言 并不重要,但对于实例变量(尤其是参数)而言则更为重要:您对参数进行的设置越少,调用者就将传递哪些参数的灵活性就越大。



 类似资料:
  • 问题内容: 我看到其他地方说: 等于 我测试了一下,他们确实做了同样的事情。但为什么?到底是什么? 问题答案: AND和OR运算符都可以捷径。 因此,仅在第一个表达式为true时才尝试第二个表达式(更确切地说,是类似事实的表达式)。第二个操作确实起作用(无论其内容如何)的事实无关紧要,因为除非第一个表达式的计算结果为真,否则它不会执行。如果是事实,则将执行它以尝试第二次测试。 相反,如果语句中的第

  • 我写了自己的类加载器,它与类一起工作,实现了接口插件。但是我不能将类转换为插件。怎么了? 错误:(18,47)java:不兼容的类型:java。lang.类无法转换为插件 我补充说,这是我的SimpleClassLoader类的主要部分,它扩展了ClassLoader。

  • 问题内容: 在Swift中,您可以使用if let可选绑定将可选内容解包为具有相同名称的常量或变量: 对于语句中的所有内容,可选项都被包装为常规int。 同样,我可以使用保护语句来达到类似的效果 但是,我不能使用这样的代码: 为什么不? 在保护语句中,如果保护语句的条件失败,则执行else子句,然后退出当前作用域。如果条件成功,则将从保护语句的右括号到当前作用域的结尾创建一个新的变量/常量。 为什

  • 问题内容: 我只是无法启动此服务器,我阅读了webpack-dev-server docs 。 示例代码看起来很简单,但是无论如何我都无法成功启动此服务器,无论是哪个文件夹,它都无法获取 内容 ! 任何帮助将不胜感激。 输出: 我的项目结构: package.json webpack.config.js 版: 问题答案: 第一个问题是您要从中提供内容,但是您没有该目录,而您却拥有该目录,这甚至不是

  • 问题内容: 早在2016年11月,我发布了一个问题,询问为什么我不能使用Guard创建与变量名称相同的未包装版本的变量,就像让let那样: 链接: 为什么后卫不让foo = foo有效? 当我编写该问题时,以下代码将无法编译,并显示“定义与先前值冲突”的错误: 但是,我只是在工作中发现了一些可以做到这一点的代码,现在它可以毫无抱怨地进行编译,并且可以完成我想要的工作!运行时,print语句显示fo

  • 问题内容: 我以为我很聪明。但是鉴于最近的发现,我不确定。在页面生命周期中,可能有许多数据库交互。有些背靠背,有些则散布开来。因此,我发明了一个对象,该对象在HttpContext.Items字典中使SQL连接的实例保持活动状态。然后,每个数据库请求都使用此连接,并且当http请求结束时,我会正确处理该连接。我们正在等待几百毫秒的时间,连接将打开,并且通过大量的HTTP高速缓存,可用连接的用尽也不