gpt4 book ai didi

java - 在 Java 中从 List 路由方法调用的最佳方法

转载 作者:行者123 更新时间:2023-11-30 02:28:31 26 4
gpt4 key购买 nike

根据列表中不同的对象类型调用类的不同方法的最佳方法是什么?

常见示例:

public class Dog extends Animals{
...
public void say(){
System.out("i'm a dog");
}

public class Cat extends Animals{
...
public void say(){
System.out("i'm a cat");
}

public class OtherClass {
public void route(){
List<Animals> aList = new ArrayList<>();
a.add(new Dog());
a.add(new Cat());
for(Animals a:aList)
methodOverloaded(a); ---> that's the point <---
}
public methodOverloaded(Dog d){
d.say();
}

public methodOverloaded(Cat c){
c.say();
}
}

当然,隐喻目标是在第一次迭代时打印 I'm a dog ,在第二次运行时打印 I'm a cat methodOverloaded().

我试过了

  • 访客模式
  • instanceOf()

但我正在寻找更好的解决方案。

编辑:我非常想调用示例的OtherClass的重载方法。

最佳答案

最好的方法是在 Animal 中定义抽象方法并在子类中重写它。这就是多态性的工作原理。

无需重载。

public abstract class Animal {
public abstract void say();
}

public class Dog extends Animal {

@Override
public void say() {
System.out.println("Bark");
}
}

public class Cat extends Animal {

@Override
public void say() {
System.out.println("Meow");
}
}

用法:

public class Main() {
public static void main(String[] args) {
List<Animals> aList = new ArrayList<>();
a.add(new Dog());
a.add(new Cat());
for (Animals a : aList)
a.say();
}
}

输出:

Bark
Meow

____UPDATE_1

我想添加一些评论,为什么重载这些方法不是一个好主意。

如果您将以下内容添加到代码中 - 它将编译:

public methodOverloaded(Animal a) {
a.say();
}

但是它不会像你期望的那样工作。它将为 List 的所有元素调用 public methodOverloaded(Animal a)

为什么会发生这种情况?

对于循环的所有迭代,参数的编译时类型为Animal。每次迭代中运行时类型都不同,但这并不影响重载的选择。由于参数的编译时类型为 Animal,因此唯一适用的重载是第三个。

该程序的行为是违反直觉的,因为重载方法之间的选择是静态的,而重写方法之间的选择是动态的。

根据调用该方法的对象的运行时类型,在运行时选择重写方法的正确版本。

可以通过以下方式修复此问题:

public methodOverloaded(Animal a) {
if (a instanceof Cat) ? "Meow" :
(a instanceof Dog) ? "Bark" : "Unknown Animal"
}

当然,带有重写方法的建议选项演示了更好的方法和更干净的代码。

此外,一个安全、保守的策略是永远不要导出两个重载相同数量的参数,因为它可能会混淆 API 的客户端。您始终可以为方法指定不同的名称,而不是重载它们。

但存在这样的情况:每对重载中至少有一个对应的形式参数在两个重载中具有“完全不同”的类型(当显然不可能将任一类型的实例强制转换为另一种类型时)。

例如,ArrayList 有一个采用 int 的构造函数和第二个采用 Collection 的构造函数。很难想象在任何情况下都会调用这两个构造函数中的哪一个。

关于java - 在 Java 中从 List 路由方法调用的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44911244/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com