包含同一超类的不同对象的ArrayList - 如何访问子类的方法

2023-11-23

您好,我想知道是否有一个简单的解决方案可以解决我的问题,

我有一个ArrayList:

ArrayList <Animal> animalList = new ArrayList<Animal>(); 

/* I add some objects from subclasses of Animal */

animalList.add(new Reptile());
animalList.add(new Bird());
animalList.add(new Amphibian());

他们都实现了一个方法move() - The Bird飞翔时move()叫做。 我知道我可以使用这个来访问超类的常用方法和属性

public void feed(Integer animalIndex) {
    Animal aAnimal = (Animal) this.animalList.get(animalIndex);
    aAnimal.eat();
}

很好 - 但现在我想访问move()子类方法Bird有。 我可以通过投射来做到这一点Animal as a Bird:

Bird aBird = (Bird) this.animalList.get(animalIndex);
aBird.move();

在我的情况下,我不想这样做,因为这意味着我有 3 个不同的上述代码集,每个子​​类型都有一个Animal.

好像有点多余,有更好的办法吗?


实际上没有一个好的方法可以从超类中执行此操作,因为每个子类的行为都会有所不同。

确保您确实拨打了适当的电话move方法、改变Animal从超类到接口。然后当你打电话时move方法,您将能够确保为所需的对象调用适当的移动方法。

如果您想保留公共字段,那么您可以定义一个抽象类AnimalBase,并要求所有动物以此为基础,但每次实施都需要实施Animal界面。

Example:

public abstract class AnimalBase {
    private String name;
    private int age;
    private boolean gender;

    // getters and setters for the above are good to have here
}

public interface Animal {
    public void move();
    public void eat();
    public void sleep();
}

// The below won't compile because the contract for the interface changed.
// You'll have to implement eat and sleep for each object.

public class Reptiles extends AnimalBase implements Animal {
    public void move() {
        System.out.println("Slither!");
    }
}

public class Birds extends AnimalBase implements Animal {
    public void move() {
        System.out.println("Flap flap!");
    }
}

public class Amphibians extends AnimalBase implements Animal {
    public void move() {
        System.out.println("Some sort of moving sound...");
    }
}

// in some method, you'll be calling the below

List<Animal> animalList = new ArrayList<>();

animalList.add(new Reptiles());
animalList.add(new Amphibians());
animalList.add(new Birds());

// call your method without fear of it being generic

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

包含同一超类的不同对象的ArrayList - 如何访问子类的方法 的相关文章

  • 序列化 ArrayList

    我正在尝试编写一个 Android 游戏 即使用户想要返回主菜单或者活动被系统终止 我也希望能够暂停游戏 onSaveInstanceState 似乎并没有给我很大的控制权来决定何时可以读回捆绑包 而且据我所知 捆绑包仅在短时间内有效 所以
  • import java 导入错误:没有名为 java 的模块

    我似乎遇到了障碍 根本无法解决这个问题 任何人都可以帮我弄清楚为什么我无法导入 java 模块吗 Error Traceback most recent call last File datasource config py line 3
  • 在 Gradle 中运行自定义测试任务而无需重新编译

    我有一个 Gradle 自定义测试任务来运行我的集成测试 我希望能够在 Gradle 不自动完成之前的所有阶段并仅运行测试的情况下运行它 有没有办法在每个构建步骤不使用 x 的情况下执行此操作 None
  • 如何将参数传递给Workmanager DoWork方法

    我想安排任务在 24 小时后从数据库中删除 public class WorkManager extends Worker public WorkManager NonNull Context context NonNull WorkerP
  • 将更改(永久)保存在数组列表中?

    那可能吗 例如 用户将新的项目 元素添加到数组列表 缓冲读取器进程 中 并且肯定会发生更改 我的问题是 即使用户多次更改数组列表 它也可能会永久存在 即使他们关闭程序并再次打开它 它也会一直存在 注意 不使用 txt 很抱歉问这样的问题 但
  • bean 的 CDI @TransactionAttribute

    我正在尝试CDI在测试应用程序上 我有一个DAO它注入一个托管的容器JTA像这样的持久化上下文 public class TestDAO implements Serializable PersistenceContext private
  • 如何在 Android 中签署 AAR Artifacts?

    我目前正在开发一个 AAR android 库 我想用我自己的密钥对已发布的工件进行签名 以便我可以确定我是否发布了具有相同名称和功能的假 aar 注意事项1 我希望能够以编程方式检查我的库的真实性 即使是一个伪造的库 只是伪造了我的 aa
  • TableModel setCellEditable 并自动将值设置回 false

    我目前正在尝试在 JTable 中实现 JPopupMenu 它允许解锁单元格以进行编辑 Override public void actionPerformed ActionEvent e if e getActionCommand Un
  • 简单的Java程序插入USB热点后速度慢100倍

    我有以下Java程序 class Main public static void main String args throws java io IOException long start System nanoTime java io
  • 在休眠搜索中使用现有分析器AnalyzerDiscriminator

    Entity Indexed AnalyzerDefs AnalyzerDef name en tokenizer TokenizerDef factory StandardTokenizerFactory class filters To
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 在Android项目中引用(纯java)项目(找不到类)

    我试图在我的 Android 项目中引用一个纯 java 项目 gt Java 项目有一大堆我需要使用的类 哦 正如第一个回复所指出的 我正在使用 eclipse 是的 唯一的问题是 我总是找不到类 XXX 从方法 com example
  • Java泛型类型参数中的问号是什么意思? [复制]

    这个问题在这里已经有答案了 这是取自斯坦福解析器附带的一些示例的一小段代码 我已经用 Java 进行了大约 4 年的开发 但从未对这种风格的代码应该表示什么有非常深入的理解 List
  • Java 中有类似 .NET 的 NotImplementedException 的东西吗?

    有没有类似 NET 的东西NotImplementedException在Java中 康芒斯朗 http commons apache org proper commons lang javadocs api 2 6 org apache
  • 不鼓励在Web应用程序中使用线程吗?

    我们与同事就在 Java 的 Web 应用程序中使用线程进行了激烈的讨论 他们的观点是 不建议在 Java Web 应用程序中使用线程 因为它们不受容器管理 一般来说 我对此表示同意 因为线程可能会干扰容器 但是 如果它不是 Java EE
  • 使用替换但不使用根元素的 Jaxb 继承

    我正在浏览布莱斯的博客http blog bdoughan com 2010 11 jaxb and inheritance using substitution html http blog bdoughan com 2010 11 ja
  • 优雅地避免 Java 中的 NullPointerException

    考虑这一行 if object getAttribute someAttr equals true 显然这一行是一个潜在的错误 属性可能是null我们会得到一个NullPointerException 因此我们需要将其重构为以下两个选择之一
  • 如何使用 iBatis (myBatis) 的注释进行 IN 查询?

    我们只想在 MyBatis 中使用注释 我们确实在努力避免使用 xml 我们尝试使用 IN 子句 Select SELECT FROM blog WHERE id IN ids List
  • 如何将字符串解析为map

    有一个像A B C D E F这样的字符串 如何将其解析为map 我会使用拆分 String text A B C D E F Map
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi

随机推荐

  • 强制 MS VS2010 在每次构建时重建一个 cpp 文件

    在一个 cpp 文件中我使用 DATE 宏来获取编译日期 它给了我最后一次编译的日期该文件的 但由于文件不经常更改 因此大多数情况下日期都是旧的 有时甚至是几个月 我真正想要的是上次构建的日期项目的 是否有一个设置可以强制 VS2010 在
  • 将张量值以二进制格式保存到文件的最佳方法是什么?

    我正在尝试将张量值以二进制格式保存到文件中 特别是我试图将 float32 张量值保存为二进制格式 IEEE 754 格式 请你帮助我好吗 import tensorflow as tf x tf constant 1 0 2 0 3 0
  • 无法浏览到我的 EC2 实例 [已关闭]

    Closed 这个问题是无关 目前不接受答案 我刚刚 大约 1 小时前 关联了一个弹性IP到我在亚马逊的实例EC2 如果我通过 SSH 连接到我的实例并输入lynx localhost我可以看到 apache 有响应 因为我看到It wor
  • 在 Android Activity 中创建弹出窗口时出现问题

    我正在尝试创建一个仅在应用程序第一次启动时出现的弹出窗口 我希望它显示一些文本并有一个按钮来关闭弹出窗口 但是 我在让 PopupWindow 正常工作时遇到了麻烦 我尝试了两种不同的方法 首先 我有一个 XML 文件 它声明了名为 pop
  • 具有虚拟目录的 ASP.net 母版页中的基本 URL

    我有一个 ASP net 母版页 在这个 master 中 我定义了所有 css 和 javascript 文件 我还有一些图像 一些按钮和超链接 所有的 url 都被声明为相对的 即 scripts ian js 如果该网站是根网站 则一
  • 抓住滑动即可消除事件

    我正在使用 Android 通知在服务完成 成功或失败 后提醒用户 并且我想在该过程完成后删除本地文件 我的问题是 如果发生失败 我想让用户有 重试 选项 如果他选择不重试并忽略通知 我想删除出于处理目的而保存的本地文件 图像 有没有办法捕
  • 无法添加对“Newtonsoft.Json”的引用

    我刚刚在 PC 上安装了 Windows 8 并下载了适用于 Windows 8 的 Microsoft Visual Studio Express 2012 更新了所有内容 当我尝试通过包管理器控制台安装任何内容时 出现以下错误 PM g
  • 在 Ruby 中获取人的年龄

    我想从一个人的生日得到他的年龄 now birthday 365不起作用 因为有些年份有 366 天 我想出了以下代码 now Date today year now year birth date year if date year ye
  • 在 shell 中更改 PYTHONPATH

    我是 Python 和 shell 脚本的全新用户 并且在这个问题上陷入了死胡同 即使在谷歌搜索这个问题并多次用头撞桌子之后也是如此 任何帮助表示赞赏 我在通过 SSH 连接的 shell 上运行 Python 2 7 3 我下载了一些代码
  • file_get_contents 不适用于本地文件

    我最近将 XAMPP 从 PHP 5 2 升级到 5 3 1 我似乎在使用 file get contents 时遇到问题 我可以使用该函数来获得类似 http www google com 但是当我在本地设置的域上使用它时 它会超时 例如
  • Facebook graph api JSONP 格式,第一行中的 /* */ 表示什么?

    我注意到 facebook graph api 返回的 JSONP 输出中有一个空注释块 所有方法 我调用的网址 https graph facebook com NUMERIC FACEBOOK ID friends access tok
  • SMTP 服务器响应:530 5.7.0 必须首先发出 STARTTLS 命令

    SMTP 服务器响应 530 5 7 0 必须首先发出 STARTTLS 命令 当我在 php 脚本文件中使用 mail 函数时 出现此错误消息 我正在使用 gmail SMTP 服务器 gmail 使用 STARTTLS 这是安全的 SS
  • 如何在没有过滤器的情况下从设备中检索所有 CNContactStore

    我正在尝试插入var contacts CNContact the var store CNContactStore 但我没有找到适合这项工作的正确代码 我找到了这个函数 我需要给它命名 func findContactsWithName
  • Git拉取、合并更改是工作树吗?

    我从 GitHub 克隆了一个存储库 并使用以下命令创建了一些工作树 git worktree add path branch 当我从以下位置提取更改时master 这些工作树也会更新吗 根据您用来 拉取更改 的命令 答案是 否 或 不完全
  • 从 msdb.dbo.sysjobhistory 获取最近 24 小时的作业记录

    我想编写一个查询来从 msdb dbo sysjobhistory 表中获取过去 24 小时的作业记录 但我无法获取 因为我得到的 run date 和 run time 列以数字形式返回 如何将 run date 和 run time 列
  • 从 Base64 编码的字符串中检索 MIME 类型

    假设有一个以 Base64 字符串编码并提供给我的文件 例如 myfile jpeg 我无法知道文件类型是什么 我想将字符串解码为文件 本例中为图像 我如何知道文件的类型 例如 jpeg 一般来说 base 64 编码的字符串绝对可以包含任
  • URL 更改时如何更新 AngularJS 指令? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 AngularJS 设置活动选项卡样式 我正在使用 AngularJS 并尝试在显示该选项卡内容时将 当前 类添加到我的菜单中 这是我到目前为止所拥有的 加载页面时效果很好 HTML ul li
  • 获取与 Android 版 Facebook 同步的联系人照片

    我试图在我的应用程序中显示联系人图片 但我得到的是那些仅手动添加的照片 而不是那些与 Facebook 同步的照片 如何解决这个问题 下面是我的代码 Uri uri ContentUris withAppendedId ContactsCo
  • PHP var_dump 的 .NET 等效项是什么?

    我记得不久前看到 反射命名空间中可能有一些方法可以递归运行ToString 对象的所有属性并对其进行良好的格式化以供显示 是的 我知道我想要的一切都可以通过调试器访问 但我想知道是否有人知道该命令 我认为您正在寻找的是 曾经被称为Objec
  • 包含同一超类的不同对象的ArrayList - 如何访问子类的方法

    您好 我想知道是否有一个简单的解决方案可以解决我的问题 我有一个ArrayList ArrayList