为什么在 Java 中用接口名称来声明变量? [复制]

2023-12-11

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

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

我不明白的是:创建这样的局部变量似乎是常见的做法:

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

虽然这种形式不太常见:

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

这里有什么好处呢?

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


当你阅读时

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

你会觉得你所关心的只是成为一个List<String>并且您不太重视实际实施。此外,您将自己限制为由以下人员声明的成员:List<String>而不是具体的实现。你并不关心你的数据是否存储在线性数组或一些奇特的数据结构中,只要它看起来像一个List<String>.

另一方面,阅读第二行会让您知道代码cares关于变量是ArrayList<String>。通过编写此内容,您(对未来的读者)隐含地说,您不应该盲目地更改实际的对象类型,因为代码的其余部分relies事实上,它确实是一个ArrayList<String>.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在 Java 中用接口名称来声明变量? [复制] 的相关文章

  • C# 中 getter 和 setter 的接口

    当我读到这里时http msdn microsoft com en us library 75e8y5dd 28v VS 100 29 aspx http msdn microsoft com en us library 75e8y5dd
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 有人用过 ServiceLoader 和 Guice 一起使用吗?

    我一直想通过我们的应用程序 构建系统进行更大规模的尝试 但更高的优先级不断将其推到次要地位 这似乎是加载 Guice 模块的好方法 并且避免了关于 硬编码配置 的常见抱怨 单个配置属性很少会自行更改 但您几乎总是会有一组配置文件 通常用于不
  • JOOQ 忽略具有默认值的数据库列

    看来JOOQ完全忽略了数据库列的默认值 既不会更新 ActiveRecord 对象 也不会在 INSERT 时跳过此列 相反 它尝试将其设置为 NULL 这在 NOT NULL 列上失败 Example CREATE TABLE bug f
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • 使用 Proguard 通过 Dropbox.com 库混淆 Android 应用程序

    我刚刚创建了一个需要 Dropbox com API 库的 Android 应用程序 我现在尝试在 发布 模式下构建应用程序 并希望在代码上运行混淆器以对其进行混淆 但是 每当我尝试运行 Proguard 时 都会收到以下错误 Progua
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • Java 8 Stream,获取头部和尾部

    Java 8 引入了Stream http download java net jdk8 docs api java util stream Stream html类似于 Scala 的类Stream http www scala lang
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • 即使禁用安全性,OAuth 令牌 API 也无法在 Elastic Search 中工作

    我是 Elastic search 新手 使用 Elastic search 版本 7 7 1 我想通过以下方式生成 OAuth 令牌弹性搜索文档 https www elastic co guide en elasticsearch re
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • Spring 作为 JNDI 提供者?

    我想使用 Spring 作为 JNDI 提供程序 这意味着我想在 Spring 上下文中配置一个 bean 可以通过 JNDI 访问该 bean 这看起来像这样
  • 关闭扫描仪是否会影响性能

    我正在解决一个竞争问题 在问题中 我正在使用扫描仪获取用户输入 这是 2 个代码段 一个关闭扫描器 一个不关闭扫描器 关闭扫描仪 import java util Scanner public class JImSelection publ

随机推荐

  • 所有的无限循环都是不好的吗?

    出于好奇 有all无限循环不好 如果运行无限循环会产生哪些不良影响和后果 另外 如果它们并不全是坏事 您能否举一些例子 说明它们何时能发挥有意义的作用 他们需要有什么东西来关闭实例吗 例如 我们总是在 Java 中使用 StreamRead
  • 有没有办法从 MassTransit 获取原始消息?

    我有一个具有通用参数的消费者IEvent 该类型是所有消息的基接口 以及子接口IEvent还有一些其他属性 我希望能够访问具有嵌套类型的所有属性的原始消息 而不仅仅是IEvent范围 这些属性可以通过 RMQ 管理仪表板查看 我认为应该有一
  • Powershell Invoke-Webrequest 在没有表单的情况下进行页面登录

    I saw 这个帖子没有解决方案 但我的问题是类似的 我正在尝试在我自己的登录页面上自动查找我正在使用的服务的一些信息 当我运行以下命令时 它没有给我任何信息 Forms Webpage Invoke WebRequest Uri http
  • Python pandas:读取带有多个表重复前导码的csv

    有没有一种Python式的方法来找出CSV文件中的哪些行包含标题和值以及哪些行包含垃圾 然后将标题 值行放入数据框中 我对 python 比较陌生 一直使用它来读取从科学仪器的数据日志导出的多个 CSV 到目前为止 在处理其他任务的 CSV
  • Modbus 错误:[输入/输出] 未收到来自远程设备的响应

    我尝试从 Mac 笔记本电脑连接到 Modbus 设备 MR SI4 使用串行连接 使用 USB RS485 转换器 安装 到 dev cu SLAB USBtoUART 这是我的代码 import logging logging basi
  • 如何通过bundle发送对象

    我需要传递对通过包进行大部分处理的类的引用 问题是它与意图或上下文无关 并且具有大量非原始对象 如何将类打包成可打包 可序列化并将其传递给startActivityForResult 您还可以使用 Gson 将对象转换为 JSONObjec
  • querydsl生成的q源代码未正确导入

    我正在尝试将 querydsl 添加到现有系统 但在获取生成的 Q 源进行编译时遇到问题 我读过几个类似的问题和解释 https spring io blog 2015 09 04 what s new in spring data rel
  • Lucene 搜索匹配短语中的任何单词

    我想搜索包含很多单词的字符串 并检索与其中任何单词匹配的文档 我的索引方法如下 Document document new Document document add new TextField termos text Field Stor
  • 使用 GridF 从 mongoDB 读取和显示图像

    我已经能够使用 GridFs 成功将图像上传到 mongoDB 以下是我的数据库中的图像 fs 文件 fs 块 下面是我用来上传图片的代码 var Grid require gridfs stream var mongoose requir
  • Ionic 4. NavParams 的替代方案

    我正在使用 ionic 4 它不接受使用 navparams 接收数据 这是我的发件人页面方法 private route Router gotoFinalView intent this route navigateByUrl inten
  • 3 次划分的中位数

    我找到了以下代码 用于使用第一个 最后一个和中间元素的中值查找快速排序的枢轴 int middle low high 2 if a middle compareTo a low lt 0 swapReferences a low middl
  • 内核启动和内核执行之间的时间

    我正在尝试使用 VS 2010 的 Parallel Nsight 2 1 版本来优化我的 CUDA 程序 我的程序在带有 GTX 480 板的 Windows 7 32 位 机器上运行 我已经安装了 CUDA 4 1 32 位工具包和 3
  • 为什么 self.kill() 不从组中删除对象?

    我不久前问过这个问题 但答案并不完全有帮助 而且我不相信我发布了最小的可重现示例 一段时间 self lifetime 过去后 我试图杀死我的子弹 self kill 命令被执行 但它并没有从相机组中删除子弹 这就是我用来绘制所有子弹的 相
  • 从其他类对 WinForm 控件进行线程安全更新

    有人可以帮我解决以下问题吗 有两个类 MainForm 和 LWriter 下面是 LWriter 中的一个方法 除了写入文件之外 还向 RichTextBox 控件发送一些更新 通过 mainForm UpdateLog text 一切工
  • JavaScript 函数类似于 Python range()

    JavaScript 中是否有类似于 Python 的函数range 我认为应该有比每次都写以下几行更好的方法 array new Array for i 0 i lt specified len i array i i 对于 ES6 中非
  • 从提升的会话启动非提升的提示

    我有一些工具如果从提升的会话运行则无法工作 我正在运行提升的会话 在管理安装的上下文中 因此这是强制性的 因此这是不可更改的 除了创建计划任务并执行它之外 还有什么更快或更友好的方法吗 编辑 这是需要未提升运行的命令 vboxmanage
  • 在输入时将动画添加到边框底部

    我希望输入的边框底部颜色在单击时随动画变化 与黄线一类似 我希望它出现在所有输入框和选择上 input container display inline block text align center awsome input paddin
  • 读取 XML 数据时超出了最大字符串内容长度配额 (8192)

    我正在尝试将一个大字符串 24 000 到 50 000 个字符 传递给自托管 TCP WCF 服务 我已将 maxStringContentLength 所有位置 提高到 22008192 我在某处读到我需要将绑定配置更改为 LargeB
  • 列名称为 END 的“END 处或附近存在语法错误”

    我在 MYSQL 中有一个表 必须在 postgresql 中转换它 我正在使用以下命令来创建表 create table emp COMPLETE BOOLEAN NOT NULL END BOOLEAN NOT NULL 我得到的错误是
  • 为什么在 Java 中用接口名称来声明变量? [复制]

    这个问题在这里已经有答案了 这是一个真正的初学者问题 我仍在学习 Java 基础知识 我可以 某种程度上 理解为什么方法会返回 List 而不是 ArrayList 或者为什么它们会接受 List 参数而不是 ArrayList 如果它对方