协方差在这里安全吗?

2024-03-01

class Food{}

class Meat extends Food{}

class Animal{
    void feed(Food f){}
}

class Lion extends Animal{
    void feed(Meat m){}
}


void foo(Animal a){
   Food f = new Food();
   a.feed(f);
}

如果我们发送至foo(new Lion())? 我知道它会出错,但我需要解释


Your Lion可以吃Meat,但它也可以吃任何种类的食物(如菠菜)。

If your Lion不能吃任何种类的Food,那么它不能被认为是一个实现Animal.

当决定使用子类化和类继承作为构建程序的方法时,理解这一点至关重要:不要使子类比接口或超类更具体。

为了使子类化以解决问题(而不是制造问题)的方式工作,您需要遵守以下准则:All subclasses must be functionally equivalent to the super-class (Liskov Substitution Principle) http://en.wikipedia.org/wiki/Liskov_substitution_principle这意味着提供对三个不同数据库的数据库访问的三个类是公共类的子类(或者可能共享公共接口)的良好候选者,因为“功能”是“提供数据库访问”。

你在哪里Lion例子不足的是根据你的定义Animal在现实世界中,狮子不是Animal因为现实世界的狮子不吃任何种类的东西Food。现实世界中的狮子的进食能力比未知动物的一般定义更为具体。正是这种功能差异使得将现实世界中的狮子建模为动物的这个具体定义不合适。

您可以通过以下方式轻松解决此问题Animal“吃食物”方法扔IncompatibleFoodException,这改变了一个的定义Animal从“吃食物”到“吃或拒绝食物”。

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

协方差在这里安全吗? 的相关文章

  • 如何使用 Java 以独立于平台的方式读取 Windows 共享驱动器?

    如何使用 Java 从 Windows 共享驱动器中读取数据 以便执行读取的 Java 代码可以在任何平台上同样正确地运行 您可以使用JCIFS http jcifs samba org 使用纯 Java 代码访问 SMB CIFS 共享
  • JDT - 尝试更改类型的超类。我不知道超级类的限定名称

    我有一个程序 除其他任务外 还必须使用 JDT 更改某些类的超类 我有两个字符串 其中包含要交换的超类的限定名称 例如 org example John 和 org example Smith 并且我正在解析整个 AST 搜索扩展这些类的类
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • 将倒计时器从 10 秒改为 1 秒

    我有一个倒计时器 它以 1 秒的增量从 10000 毫秒倒计时到 0 毫秒 以使按钮在 10 秒后可单击 尽管计时器是准确的并且按照代码的说明执行操作 但我想更改秒的表示方式 但我不知道如何更改 java void startTimer c
  • 如何测试 Jersey REST Web 服务?

    我已经编写了一个 Restful Web 服务 并且必须使用 JUnit4 对其进行测试 我已经使用 Jersey Client 编写了一个客户端 但想知道我是否只能使用 junit4 测试我的服务 至少有人可以帮我提供样品吗 我的休息服务
  • Java 8 中异常类型推断的一个独特功能

    在为该网站上的另一个答案编写代码时 我遇到了这个特性 static void testSneaky final Exception e new Exception sneakyThrow e no problems here nonSnea
  • 克隆 dom.Document 对象

    我的目的是将xml文件读入Dom对象 编辑dom对象 其中涉及删除一些节点 完成此操作后 我希望将 Dom 恢复到其原始状态 而不实际解析 XML 文件 无论如何 我可以克隆第一次解析 xml 文件后获得的 dom 对象吗 这个想法是避免一
  • 如何将 Cucumber 中的数据表转换为对象列表?

    原标题 Java 中的 Cucumber DataTables 中的标量是什么意思 From 参考 Java 提供了几种标量类型 这些包括原始数字 类型 加上布尔值和字符 每个标量 原始 类型都有一个关联的包装类或 参考类型 阅读javad
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • Poi:从 xlsm 打开 Excel 文件后将其保存为 xlsx

    我正在编写一个java程序 它打开一个用户定义的excel文件 用数据填充它 然后将其保存在用户指定的路径 文件名和扩展名下 即使输入文件是 xlsm 也应该可以声明输出保存为 xlsx 但实际上是不可能的 如果我尝试使用下面的代码 打开文
  • 如何将点击侦听器添加到 Android/Java Textview 中的字符串中?

    我想要完成的是大多数 Twitter 应用程序中的标准操作 在文本视图中 文本字符串中的单词前面可能有 提及或 主题标签 并且它们实际上能够添加点击侦听器这个词启动了另一项活动 有谁知道这是如何实现的 下面我附上了一张示例照片 显示了我想要
  • MongoDb Spring 在嵌套对象中查找

    我正在使用 Spring Data Mongodb 和这样的文档 id ObjectId 565c5ed433a140520cdedd7f attributes 565c5ed433a140520cdedd73 333563851 list
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 使用 JavaFX 将可执行 Jar 限制为一个窗口

    我正在通过构建 JavaFX 应用程序E fx 剪辑 and Java场景生成器 基本功能是登录窗口 登录后 将打开新窗口 然后登录窗口消失 目前还处于原型阶段 用完eclipse后 我想要的功能都有了 启动时显示登录窗口 代码如下 Ove
  • 在Java中,为什么某些变量首先需要初始化,而其他变量只需要声明?

    我试图更深入地理解我是否遗漏了一些关于 Java 何时需要变量初始化与简单声明的理解 在以下代码中 不需要为变量 row 赋值即可编译和运行 但变量 column 则需要赋值 注意 该程序没有任何用处 它已被修剪为仅显示此问题所需的内容 以
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 如何为用户的活动设置计时器?

    如果用户在 5 小时内停止工作 我需要执行特定的方法 假设用户已登录 但他在 5 小时内没有向数据库的特定表添加任何记录 任何时候用户将记录添加到指定的表中 该特定用户的计时器都应该重置 否则它将继续运行 如果达到 5 小时 应用程序应显示
  • 无法取消 GWT 中的重复计时器

    我正在尝试在 GWT 中安排一个重复计时器 它将每一毫秒运行一次 轮询某个事件 如果发现满意 则执行某些操作并取消计时器 我尝试这样做 final Timer t new Timer public void run if condition
  • eclipse.ui.menus 的名称过滤器

    我有一个菜单贡献 通过实现org eclipse ui menus扩展点 我想仅为特定文件扩展名 例如 pld 提供此菜单贡献 但我不知道如何使用 visibleWhen 来做到这一点 有任何想法吗 更新 到目前为止我的扩展点

随机推荐

  • 如何在 Spark 窗口函数中使用 orderby() 降序排列?

    我需要一个窗口函数 该函数按某些键 列名称 进行分区 按另一个列名称进行排序并返回排名前 x 的行 这对于升序来说效果很好 def getTopX df DataFrame top x String top key String top v
  • 如何在 Java 中逐步解码大型多字节字符串文件?

    我有一个程序可能需要处理可能包含多字节编码的大文件 我当前执行此操作的代码存在创建内存结构来保存整个文件的问题 如果文件很大 这可能会导致内存不足错误 Charset charset Charset forName UTF 8 Charse
  • 仅当这些消息存在时,如何在 primefaces 中显示带有 requiredMessages 的弹出窗口?

    当我单击提交按钮时 我想显示一个弹出窗口 其中包含某些 inputText 字段的 requiredMessages 但仅限于有这些消息的情况 我已经尝试在 oncomplete 标签上使用 bean 变量和 javascript 但我无法
  • 反应本机嵌套堆栈导航显示空屏幕

    我正在尝试使用 Stack navigator 实现嵌套反应本机导航example https reactnavigation org docs 5 x nesting navigators 来自网站 我还检查了 SO 中的其他问题 但无法
  • 删除作品但不隐藏?

    为选择菜单创建过滤器并遇到一些问题 第一个是 filterContentMenu option contains a hide 不起作用但是 filterContentMenu option contains a remove does 实
  • 确保 SQLite 表只有一行

    如何强制表只有一行 以下是我尝试过的 这UPDATE触发器可能会起作用 但是CREATE触发肯定不会 对于创建 我想使用SET 然而 SETSQLite 不支持 CREATE TABLE IF NOT EXISTS config id TI
  • 二维条码与一维条码 - 速度、准确性、尺寸

    我想为我的移动项目需求之一实现条形码 要存储的数据量非常少 扫描速度 尺寸 移动相机识别所需的最小显示尺寸 这更重要 准确性 从典型的处理和SDK角度考虑 最好是zxing 我会使用二维码 特别是如果您打算使用手机摄像头 二维码具有使透视校
  • 仅在拉取请求中包含特定提交

    假设我已经克隆了存储库 创建了新分支 主题 1 进行了更改 提交了它们 然后将它们推送到远程存储库git push origin Topic1 之后我向 master 分支发出了拉取请求 然后在我的本地存储库上 我从分支 Topic1 签出
  • 即使手机锁定/睡眠时也能保持应用程序运行 - Ionic4

    应用程序是一个 ionic4 电容器应用程序 它也使用很少的 cordova 插件 我有一个与蓝牙设备关联的计时器功能 即使手机进入睡眠状态或处于锁定模式 该功能也必须保持运行 使用 cordova background mode 插件 该
  • 尝试在数据存储中存储 Utf-8 数据时出现 UnicodeEncodeError

    尝试将 utf 8 存储到数据存储中并收到错误 Traceback most recent call last File sinfo google appengine google appengine ext webapp init py
  • Android OpenGL 中 setLookAtM 方法的怪异

    作为 android 和 openGL 2 0 es 的初学者 我正在测试简单的东西并看看它是如何进行的 我在以下位置下载了示例http developer android com training graphics opengl touc
  • 获取与数据框中特定行值匹配的列名称

    我试图获取单元格值为 1 的每一行的列名 但是我的尝试没有成功 有人可以提供建议吗 library permute set seed 42 exampledf lt data frame allPerms c 1 2 3 4 example
  • AngularJS - 通过字符串获取控制器函数

    我正在使用ng include指令将具有基于范围内某些变量的动态模板和控制器 目前我有一张这样的地图 scope map key1 controller Ctrl1 templateUrl tmpl1 html key12 controll
  • 如何使用 Visual Studio 2010 编译 64 位 C DLL?

    我有一个用 C 语言编写的 DLL 源代码 这是代码通用多边形裁剪器 http www cs man ac uk toby alan software 如果您有兴趣 我通过主页上提供的 C 包装器在 C 项目中使用它 它带有一个预编译的 D
  • 如何在 Angular 1.5 组件中等待绑定(没有 $scope.$watch)

    我正在编写一个 Angular 1 5 指令 并且在尝试在绑定数据存在之前对其进行操作时遇到了一个令人讨厌的问题 这是我的代码 app component formSelector bindings forms controller fun
  • 如何从 ZSH 的历史记录中删除条目

    假设我使用 zsh 运行了一个命令 echo mysecret gt file 我可以使用命令轻松打印历史记录 包括条目号fc l 1 echo mysecret gt file 但是如何轻松地从历史记录中删除条目呢 我找不到相应的段落男人
  • Unix 中的 Chrome Headless 返回空页面源

    我正在使用 Chrome Headless 在 Unix 机器 Cent OS 中运行我的硒测试脚本 但是相同的脚本在我的本地 Windows 机器上完美运行 但在 Unix 机器中 它返回空页面源 如空 html 标签 尽管我使用最新的
  • JTable 多标题行

    I am using a JTable in my application and wish to have 2 rows for headings similar to this 这是否可能 或者我必须做其他事情吗 如果是这样 那又怎样
  • 如何将 Sass Eyeglass 与 Webpack 结合使用?

    我想用萨斯眼镜 https github com sass eyeglass eyeglass with Webpack https webpack js org 我发现有关它的信息很少 并且相当令人沮丧 因为我确信它可以完成 有人使用它取
  • 协方差在这里安全吗?

    class Food class Meat extends Food class Animal void feed Food f class Lion extends Animal void feed Meat m void foo Ani