gpt4 book ai didi

java - 方法链接,从列表返回一个对象并从中获取值

转载 作者:行者123 更新时间:2023-12-01 16:43:02 25 4
gpt4 key购买 nike

我拥有的是 Dog 对象的列表,在对象中包含一个 boolean 值,用于显示狗是否完成了训练。我想做的是迭代列表并只返回已完成训练的 Dog() 对象,例如,如果它们是 12 只狗,并且只有 3 只完成了训练,则循环应该只打印这些对象。

else if (input == 1) {
for (int i = 0; i < 12; ++i) {
//Create a temporary value to hold the object.
Object tempHold = dogKennel.getAnimal(i);
//If animal has not graduated, skip, else print.
if (!(tempHold.getGraduation())) {
continue;
}
else {
System.out.println(dogKennel);
}
}

getAnimal(i) 返回 int i 处的对象

方法 .getGraduation 已定义并返回 boolean 值,但编译器不想按原样识别临时值,并且不会超出该值。编译器一直建议强制转换 tempHold,但即使我这样做,它也不起作用。

我觉得如果我能编译它就会起作用,因为返回的对象将有一个 getGraduation() 方法(它是为动物的父类(super class)定义的。)

最佳答案

however the compiler doesn't want to recognize temp value as is, ...the compiler keeps suggesting to cast tempHold, but even if I do, it doesn't work.

编译器告诉你两件事:

  1. 对象不是(反之亦然。对象)。
  2. Object 没有为其定义方法 isGraduated()

要解决此问题,您可以将 Object 转换为 Dog:

Dog tempHold = (Dog)dogKennel.getAnimal(i);

现在我们有了一个 Dog,我们可以安全地调用它的 isGraduated() 了。但问题是我们不能确定我们有一只。如果我们从另一个狗窝得到动物,我们也可能拥有一只。在这种情况下,您将得到一个 ClassCastException,它告诉您 Cat 不能转换为 Dog

为了避免出现运行时异常,您可以添加检查:

Object tempHold = dogKennel.getAnimal(i);
if(tempHold instanceof Dog) {
Dog dog = (Dog)tempHold;
System.out.println(dog.isGraduated());
}

instanceof 检查修复了问题。

有一些方法可以完全避免这种运行时检查。一种方法是创建一个界面:

public interface CanGraduate {
default boolean isGraduated() {
return false;
};
}

然后让所有Animal实现这个接口(interface):

public abstract class Animal implements CanGraduate {
//Behavior common among all animals
}

您现在可以自由添加新的动物类型,并且放心,只要它们继承自上面的 Animal 类。

对于狗来说,isGraduated() 应该更有意义。所以你可以在他们的情况下覆盖它:

public class Dog extends Animal {
private boolean _graduated = true;

@Override
public boolean isGraduated() {
return _graduated; //or some complex logic that determines graduation
}
}

有了这个结构,您不再需要担心调用任何类型的 Animal 上的方法。

作为示例,让我们看一些驱动程序代码:

public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
Dog dog2 = new Dog();
Cat cat1 = new Cat();
Cat cat2 = new Cat();

List<Animal> dogKennel = List.of(dog1, dog2);
List<Animal> catKennel = List.of(cat1, cat2);

for(Animal x : catKennel) {
System.out.println(x.isGraduated());
}
}
}

程序将简单地输出false,因为Cat永远无法毕业。如果狗窝里有,则会输出狗的实际毕业状态。

关于java - 方法链接,从列表返回一个对象并从中获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59258245/

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