为什么在java方法重写中允许有协变返回类型,但不允许有协变参数?

2023-11-24

例如,我有一个 Processor 基类,其方法返回一个 Object 并以 Object 作为参数。我想扩展它并创建一个 StringProcessor 它将返回 String 并接受 String 作为参数。然而 协变类型仅允许与返回值一起使用,但不允许与参数一起使用。造成这种限制的原因是什么?

class Processor {
    Object process (Object input) {
        //create a copy of input, modify it and return it
        return copy;
    }
}

class StringProcessor extends Processor {
    @Override
    String process (String input) { // permitted for parameter. why?
        //create a copy of input string, modify it and return it
        return copy;
    }
}

里氏原理。在设计 Processor 类时,您编写了一个约定:“Processor 能够接受任何对象作为参数,并返回一个对象”。

StringProcessor 是一个处理器。所以它应该遵守该合同。但如果它只接受 String 作为参数,则违反了该约定。请记住:处理器应该接受任何对象作为参数。

所以你应该能够做到:

StringProcessor sp = new StringProcessor();
Processor p = sp; // OK since a StringProcessor is a Processor
p.process(new Integer(3456));

当返回一个字符串时,它并没有违反约定:它应该返回一个对象,字符串就是一个对象,所以一切都很好。

您可以通过使用泛型来实现您想要实现的目标:

class Processor<T> {
    Object process (T input) {
        //create a copy of input, modify it and return it
        return copy;
    }
}

class StringProcessor extends Processor<String> {
    @Override
    String process (String input) { 
        return copy;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在java方法重写中允许有协变返回类型,但不允许有协变参数? 的相关文章

  • 枚举的子类化

    有没有一种简单的方法来子类化Javaenum 我问这个问题是因为我有大约 10 个实现相同接口的对象 但它们对某些方法也有相同的实现 因此我想通过将所有相同的实现放置在扩展的中间对象中来重用代码Enum它也是我需要的所有其他类的超类 或许事
  • Java将字符串解析为double

    如何解析字符串中的这个 Double 00034800 变成 Double 值 最后两位数字实际上是小数点 所以我正在寻找的结果是348 00 是否有这样的格式可以与十进制格式一起使用 Well String s 00034800 doub
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • 查看Java Agent修改的Java类的源代码

    我需要了解 Java 代理如何修改我的初始类 以便我能够理解代码的作用 build gradle configurations jar archiveName agent2 jar jar manifest attributes Prema
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • JOOQ 忽略具有默认值的数据库列

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

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 如何使用双重调度来分析图形基元的交集?

    我正在分析图形基元 矩形 直线 圆形等 的交互并计算重叠 相对方向 合并等 这被引用为双重调度的一个主要示例 例如维基百科 http en wikipedia org wiki Double dispatch 自适应碰撞算法通常要求 不同的
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • IntelliJ Idea:将简单的 Java servlet(无 JSP)部署到 Tomcat 7

    我尝试按照教程进行操作here http wiki jetbrains net intellij Creating a simple Web application and deploying it to Tomcat部署 servlet
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A
  • 文本视图不显示全文

    我正在使用 TableLayout 和 TableRow 创建一个简单的布局 其中包含两个 TextView 这是代码的一部分
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某

随机推荐

  • 如何调用Web服务方法进行测试,例如从浏览器

    有一个 dll webservice 用 Delphi 制作 有一个名为List它返回字符串列表 宽字符串 是否有任何方法可以调用该服务而无需编写客户端应用程序来使用它 Ex http misitio com 8080 miwebservi
  • Emacs 24内置cedet功能亮点

    我想去掉上面的下划线功能 例如 如上面 void 的屏幕截图所示 http cedet sourceforge net img gen semantic ia complete menu png 我在文档中找不到任何明显的内容 但哎呀 我什
  • 将行替换为空格,将反斜杠替换为包含空格的字符串

    我想替换以下行 memory 20g with memory 100g 实际上它应该替换之后的任何数字 memory 以下是我所拥有的 但无法获得预期的结果 sed i E s b memory memroy 100g g a txt 您不
  • 如何在代码外部(即 XML 文件中)定义 AutoMapper 映射,或使用不同的方法来实现完全可配置的对象映射?

    EDIT 最初我打算使用 AutoMapper 来实现我的目标 但我必须知道 AutoMapper 并不是这样工作的 它使您可以创建配置文件 但在我的情况下 完全可配置 我需要为每个参数组合一个配置文件 所以我想出了一种自己的方法 请参阅答
  • AngularJS - jQuery UI - 绑定问题

    我目前正在将一个大型应用程序移植到一个基于 HTML5 的 Web 应用程序 我已经开始在 AngularJS 中构建该应用程序并享受 AngularJS 框架的强大功能 目前我遇到一个问题 我有一个指令为我提供了 jQuery Datep
  • 如何让 Python / PostgreSQL 更快?

    现在我有一个日志解析器读取 515mb 的纯文本文件 过去 4 年里每天的一个文件 我的代码目前是这样的 http gist github com 12978 我已经使用了 psyco 如代码中所示 并且我也在编译它并使用编译后的版本 它每
  • 如何将 tail -f 通过管道传输到 awk 中

    我正在尝试设置一个脚本 当日志文件中出现某个字符串时 会生成警报 已有的解决方案每分钟一次 grep 整个日志文件 并计算字符串出现的频率 使用日志行的时间戳仅计算前一分钟的出现次数 我认为用尾巴来做这件事会更有效 所以我尝试了以下方法作为
  • ASP.NET中如何在Web表单之间传递信息

    如何在asp net中将一些信息从一个Web表单发送到另一个Web表单 第一个网页表单是HumanList aspx显示a中的人类列表GridView成分 当用户单击编辑链接时 我想传递 humanID 人类记录 ID 的值 HumanLi
  • Google 自动完成教程为 swift 放置 api

    我想要一个自动完成文本字段 可以像 Android 一样自动完成位置 https developers google com places training autocomplete android 有谁知道我在哪里可以找到这方面的教程或示
  • 使用 youtube 播放器 api 在后台播放 Youtube 视频

    我已经使用成功播放了 YouTube 视频youtube player api 但我需要在按下后退按钮时在后台运行它 我用谷歌搜索了很多 但没有找到任何结果请帮助我实现这一目标 提前致谢 这是我的代码 public class Fullsc
  • 传递 null 时选择哪个构造函数?

    在下面的示例中 我有 2 个构造函数 一个采用 String 另一个采用自定义对象 在此自定义对象上存在一个方法 getId 该方法返回一个字符串 public class ConstructorTest private String pr
  • Ruby 中什么时候需要 do 关键字?

    例如 是否存在do下面的代码对程序的行为有什么影响 while true do puts Hi break end while true puts Hi break end 根据Ruby 编程语言本书第 5 2 1 节 The do中的关键
  • 如何在 SQL Server 中使用前导通配符全文搜索?

    Note I am使用 SQL 的全文搜索功能 CONTAINS 子句和所有 是全文中的通配符 仅适用于 LIKE 子句 我现在在几个地方读到 MS SQL 不支持 前导通配符 搜索 例如使用 overflow 来匹配 stackoverf
  • MongoDB v2.4.9 按布尔字段排序

    如何根据布尔字段对查询结果进行排序 考虑以下集合 id ObjectId name John isFoo true id ObjectId name Jim isFoo false id ObjectId name Joel isFoo f
  • 兼容 Nexus 的存储库,用于获取节点和 npm 安装程序

    我正在寻找一个符合 nexus 标准的存储库 我可以在其中获取节点安装程序 一个符合 nexus 标准的替代品 http nodejs org dist 语境 在java环境中 我们的构建是由maven处理的 最近我们添加了一个 javas
  • Delphi TGIFImage 与某些 GIF 查看器的动画问题

    我发现使用 Delphi 2009 创建的动画 GIFTGIFImage有时无法正确播放someGIF 观众 问题是动画过早地重新启动 考虑以下示例 program GIFAnomaly APPTYPE CONSOLE uses Windo
  • 在 GCC 中编译:-O3 有害吗?

    我听说 gcc 不应该使用 O3 选项进行编译 真的吗 如果是这样 避免使用 O3 的原因是什么 答案是 这取决于你的代码 基本的经验法则是这样的 在 O1 时 编译器会进行不需要太长时间计算的优化 在 O2 时 编译器会进行 昂贵 的优化
  • 使用 SSH.NET 在进度栏中显示文件下载进度

    我想在我的设备上显示下载过程的进度ProgressBar 我尝试做类似的事情此代码用于上传 但我失败了 这是我失败的尝试的一个例子 private void button5 Click object sender EventArgs e T
  • 在 Firebase 中恢复数据库

    如果我在 Firebase 上删除了我的应用程序 那么一周后我想恢复它 这可能吗 我了解到有备注 确认后将永久删除 谢谢 Firebase 会在实时数据库中保留数据备份 如果您不小心从数据库中删除了数据 您可以联系 Firebase 支持并
  • 为什么在java方法重写中允许有协变返回类型,但不允许有协变参数?

    例如 我有一个 Processor 基类 其方法返回一个 Object 并以 Object 作为参数 我想扩展它并创建一个 StringProcessor 它将返回 String 并接受 String 作为参数 然而 协变类型仅允许与返回值