我正在学习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不应该是安全的吗?在类似的情况下,有没有更好的方法将抽象类转换为子类?
我不明白为什么它不起作用。。我做错什么了?
提前谢谢你的回答。。
3条答案
按热度按时间8nuwlpux1#
你不应该用null,用
Optional<T>.empty()
相反,请阅读这里https://docs.oracle.com/javase/8/docs/api/java/util/optional.html#empty--icnyk63a2#
问题是,您正在检查dog.ispresent是否存在,但当值不是dog时,也可能为dog分配null。i、 在第二次迭代中。
l7mqbcuq3#
问题是您正在分配
null
到一个Optional
当instanceof
检查失败。您至少有两种选择:
使用
Optional.empty()
而不是null
```Optional dog = animal instanceof Dog ? Optional.of((Dog) animal) : Optional.empty();
Optional dog = Optional.of(animal)
.filter(Dog.class::isInstance)
.map(Dog.class::cast);