如何在java中正确地打开可选类?

dluptydi  于 2021-07-08  发布在  Java
关注(0)|答案(3)|浏览(243)

我正在学习java的基础知识,我正在探索 Optionals and abstract classes 所以我遇到了以下问题,
我有这个密码

import java.util.Optional;

public abstract class Animal {
    abstract void makeSound();

    public static void main(String[] args) {
        System.out.println("Start");

        Dog dog = new Dog();
        Cat cat = new Cat();
        Horse horse = new Horse();

        Animal[] animals = {dog, cat, horse};

        for (Animal animal : animals) {

            Optional<Dog> _dog = animal instanceof Dog ? Optional.of((Dog) animal) : null;
            Optional<Cat> _cat = animal instanceof Cat ? Optional.of((Cat) animal) : null;
            Optional<Horse> _horse = animal instanceof Horse ? Optional.of((Horse) animal) : null;

            if (_dog.isPresent()) {
                System.out.println("it is a Dog");
            } else {
                System.out.println("it is NOT a Dog");
            }

            animal.makeSound();
        }

    }
}

class Horse extends Animal {
    String speed = "Fast";
    @Override
    void makeSound() {
        System.out.println("Neighing...");
    }
}

class Dog extends Animal {
    String color = "Brown";
    @Override
    void makeSound() {
        System.out.println("Barking...");
    }
}

class Cat extends Animal {
    Integer lives = 9;
    @Override
    void makeSound() {
        System.out.println("Mewoing......");
    }
}

我希望看到控制台上的指纹“它是一只狗”,然后是2“它不是一只狗”,因为我使用的方法 .isPresent() 在期权上,
但我有一张指纹和一张 NullPointerException :
这就是我得到的印刷品:

Start
it is a Dog
Barking...
Exception in thread "main" java.lang.NullPointerException
    at com.example.helloworldeclipse.Animal.main(Animal.java:24)

ispresent不应该是安全的吗?在类似的情况下,有没有更好的方法将抽象类转换为子类?
我不明白为什么它不起作用。。我做错什么了?
提前谢谢你的回答。。

8nuwlpux

8nuwlpux1#

你不应该用null,用 Optional<T>.empty() 相反,请阅读这里https://docs.oracle.com/javase/8/docs/api/java/util/optional.html#empty--

icnyk63a

icnyk63a2#

问题是,您正在检查dog.ispresent是否存在,但当值不是dog时,也可能为dog分配null。i、 在第二次迭代中。

Optional<Dog> dog = animal instanceof Dog ? Optional.of((Dog) animal) : Optional.empty();
l7mqbcuq

l7mqbcuq3#

问题是您正在分配 null 到一个 Optionalinstanceof 检查失败。
您至少有两种选择:
使用 Optional.empty() 而不是 null ```
Optional dog = animal instanceof Dog ? Optional.of((Dog) animal) : Optional.empty();

使用可选的 `filter` 以及 `map` 方法:

Optional dog = Optional.of(animal)
.filter(Dog.class::isInstance)
.map(Dog.class::cast);

 predicate  `Dog.class::isInstance` 检查给定示例是否为 `Optional` ,是的示例 `Dog` . 这是 `equivalent` 至 `instanceof` . 那么 `Dog.class::cast` 将给定对象强制转换为 `Dog` 示例。
注:如果 `animal` 它本身可能是 `null` ,那么您应该使用 `Optional::ofNullable` 而不是 `Optional::of` .

相关问题