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

为什么在Java中使用接口名称声明变量?

司寇阳曦
2023-03-14
问题内容

这是一个真正的初学者问题(我仍在学习Java基础知识)。

我可以(有点)理解为什么方法将返回List <String>而不是ArrayList<String>,或者为什么它们将接受List参数而不是ArrayList。如果对方法没有影响(即,如果不需要ArrayList中的特殊方法),则这将使该方法更加灵活,并且更易于调用者使用。其他集合类型(例如Set或Map)也是如此。

我不明白的是:创建这样的局部变量似乎是一种惯例:

List<String> list = new ArrayList<String>();

虽然这种形式的频率较低:

ArrayList<String> list = new ArrayList<String>();

这有什么好处?

我所看到的是一个次要的缺点:必须为java.util.List添加一个单独的“ import”行。从技术上讲,可以使用“ import
java.util。*”,但我也不经常看到,这可能是因为“ import”行是由某些IDE自动添加的。


问题答案:

当你读

List<String> list = new ArrayList<String>();

您会得到一个想法,即您只关心a,List<String>而对实际实现的重视程度则降低了。同样,您将自己限制为由声明的成员,List<String>而不是特定的实现。您不必关心数据是存储在线性数组还是某些特殊的数据结构中,只要它看起来像是即可List<String>

另一方面,阅读第二行将使您想到代码 关心 变量are
ArrayList<String>。通过编写此代码,您(对将来的读者)暗含地说您不应该盲目更改实际的对象类型,因为其余代码 依赖
于它实际上是一个ArrayList<String>



 类似资料:
  • 问题内容: 有时我们有几个类,这些类的某些方法具有相同的签名,但是与声明的Java接口不对应。例如,和(在中的其他几个 )中都有一个方法 现在,假设我希望对具有该方法的对象进行一些操作。然后,我想有一个接口(或者自己定义),例如 这样我可以写: 但是,可悲的是,我不能: 此演员表将是非法的。编译器 知道 这 是不是 一个,因为类没有宣布实现该接口...... 然而“实际上”实现它 。 有时这会带来

  • 问题内容: 在开始阅读之前:这个问题不是关于理解monad的问题,而是关于确定Java类型系统的局限性的,这会限制接口的声明。 在我的努力去理解单子我读这个由埃里克利珀SO- 答案上询问单子简单的解释问题。在那里,他还列出了可以在monad上执行的操作: 有一种方法可以将未放大类型的值转换为放大类型的值。 有一种方法可以将未放大类型的操作转换为遵循前面提到的功能组成规则的放大类型的操作 通常,有一

  • 问题内容: 将接口声明为抽象有什么意义?接口方法也是如此。有什么意义吗? 例如。 问题答案: 您在哪里遇到过已发布的代码块,任何旧的Java代码库? 这就是 JLS不得不说: 9.1.1.1抽象接口: 每个接口都是隐式抽象的。该修饰符已过时,不应在新程序中使用。 9.4抽象方法声明: 为了与Java平台的较早版本兼容,出于风格考虑,允许但不鼓励为接口中声明的方法冗余地指定abstract修饰符。

  • 问题内容: 为什么我们要在Java类中声明一个接口? 例如: 问题答案: 当您想在对象中收集一些字段以强调概念时,可以创建一个外部类,也可以创建一个内部类(称为嵌套(静态)或内部)。 如果要强调这个合作类在原始对象使用之外完全没有意义(没有用)的事实,可以将其嵌套/内部。 因此,在处理某些层次结构时,可以描述一个“嵌套” ,它将由包装类的子类实现。 在JDK中,最显著的例子是内部接口中定义的接口,

  • 问题内容: 该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么? 上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public&abstract”。 问题答案: 这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别 和 由于Espo提到的原因,第一个是不可能的:你不知道哪个实现类是正确的定义。 Java

  • 我最近将一个Laravel4.2项目迁移到了5.0。到目前为止,我已经完成了所有必要的步骤,但我不断得到一个错误。 无法声明类Controller,因为名称已在使用中 我的控制器已按照laravel在升级指南中提供的内容进行了更改。 此外,我已将其添加到我的composer.json.的类映射指令 到目前为止,我找不到任何解决方案,如果你们知道该怎么做,这将对我有很大帮助:)提前谢谢!