当前位置: 首页 > 知识库问答 >
问题:

使用超类对象数组避免Java强制转换

越嘉茂
2023-03-14
Animal[] arrayOfAnimals = new Animal[100];
If(arrayOfAnimals[1] instanceof Dog) {
    ((Dog)(arrayOfAnimals[1])).speak();
}

else if(arrayOfAnimals[1] instanceof Cat) {
    ((Cat)(arrayOfAnimals[1])).speak();
}

现在假设我有许多动物子类,我将连续得到许多“else if...”

我的问题是:有没有办法避免这种情况?我已经尝试使用一个接口(动物->接口、狗、猫等实现动物),但是在我的项目中,数组必须是可克隆的,如果动物是一个接口,你就不能克隆一个数组“动物[]ArrayOfAnimals”(该数组中的对象将不会被克隆)

共有1个答案

洪飞鸿
2023-03-14

因为我需要知道那只动物是猫还是狗,因为,比如说,每只动物说话都不一样。

这听起来像是一个实现细节--如果每个动物都能以某种形式说话,那么应该将speak()方法作为一个抽象方法放入animal中。然后每个子类将重写它以提供实现。然后你就可以用

arrayOfAnimals[1].speak();

...多态性将负责使用正确的实现。

interface Foo {
}

class FooImpl implements Foo {
}

public class Test {
    public static void main(String[] args) {
        Foo[] foos = { new FooImpl() };

        Foo[] clone = (Foo[]) foos.clone();
        System.out.println(foos[0] == clone[0]); // true
    }
}
 类似资料:
  • 在通用堆栈的实现中,使用了以下习惯用法,并且没有任何问题 但是,当我尝试以下操作时,它会导致ClassCastException 这个你怎么解释?

  • 问题内容: 我正在学习如何使用SQLData,并且在投射回我的对象​​时遇到问题。 我的Oracle类型看起来像这样: 我的Java看起来像这样: 我已经在readSQL中尝试了几件事,但是没有取得太大的成功-我缺少什么? 我正在使用JDBC调用一个OUT参数为“ activities_t”的PLSQL存储过程: 谢谢!史蒂夫 (以上大部分内容都来自内存,因为代码正在起作用…) 问题答案: 您需要

  • 我希望将一个< code>int数组转换为一个< code>double数组。 所以,当我有 我想使用,比如说把它作为参数传递给一个方法。 最好的方法是什么? 演员阵容 不工作。 我可以迭代通过: 有没有更好的方法来做到这一点? <代码>系统。arraycopy不起作用——不适用于两种不同基元类型的数组。 注意:在Java和其他一些讨论中,我们看到了将对象转换为数组。 蒂亚。

  • 问题内容: 不知何故,我的旧问题已关闭,因此我打开了一个新问题: 我正在使用Java泛型从SQL查询中实现泛型双向Hash Map。它应该能够来回映射String,Integer对的任何组合。应该这样使用: 当然应该可以创建一个pm(Integer,Integer)等等。 我选择地图的实现如下所示(没有getter …): 我没有编译器错误,而且我很确定,它将以这种方式工作。但是我在“ getIn

  • 问题内容: 我有一个数组: 我想创建的另一个数组和其唯一的元素为x。 我已经试过这段代码: 但是它会产生一系列形状。 我当然可以做: 但我希望该解决方案能够轻松扩展到更大的形状,例如: 无需在所有索引上运行循环。 有什么建议可以做到这一点吗? UPD1 数组可能不同,如: 它们也可能具有不同的形状,但是对于那种情况,一个简单的构造函数就可以了 UPD2 我真的想要一种可以处理任意形状(不一定都一样

  • 本文向大家介绍Java接口中尽量避免使用数组,包括了Java接口中尽量避免使用数组的使用技巧和注意事项,需要的朋友参考一下  如果你发现在一个接口使用有如下定义方法:   那么你应该认真反思。数组不仅仅老式,而且我们有合理的理由避免暴露它们。在这篇文章中,我将试图总结在Java API中使用数组的缺陷。首先从最出人意料的一个例子开始。 数组导致性能不佳 你可能认为使用数组是最快速的,因为数组是大多