Java Instanceof方法混淆

sev*_*ang 1 java boolean interface instanceof

假设我们有以下定义.

interface Vessel{}
interface Toy{}
class Boat implements Vessel{}
class Speedboat extends Boat implements Toy{}
Run Code Online (Sandbox Code Playgroud)

主要是,我们有这些:

Boat b = new Speedboat();
Run Code Online (Sandbox Code Playgroud)

(b instanceof Toy)评估为true?为什么?我的理解是,引用类型bBoat,但Boat与之无关Toy,所以它应该是,false但答案是true.

luk*_*302 7

Boat没有任何关系Toy,你是对的.

但是你不是在Boat这里处理,而是SpeedBoat存储在Boat变量中的实际值.这SpeedBoat是一个例子Toy.

存储的类型new Speedboat()无关紧要,因为Java在运行时检查是否实际对象是其他的实例.

那样你就可以写出像

public boolean callSpeedBoatMethodIfPossible(Boat b) {
    if (b instanceof SpeedBoat) {
        ((SpeedBoat)b).driveVerySpeedy();
    }
}
Run Code Online (Sandbox Code Playgroud)