gpt4 book ai didi

java - 为什么这个 instanceof 代码可以工作并且不会导致编译时错误?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:48:01 25 4
gpt4 key购买 nike

在下面的代码中,x 的类型是 I(虽然 x 也实现了 J 但在编译时不知道)那么为什么 (1) 处的代码不会导致编译时错误。因为在编译时只考虑引用的类型。

public class MyClass {
public static void main(String[] args) {
I x = new D();
if (x instanceof J) //(1)
System.out.println("J");
}
}

interface I {}

interface J {}

class C implements I {}

class D extends C implements J {}

最佳答案

instanceof 用于运行时确定对象的类型。您正在尝试确定程序运行时 x 是否真的是 J 类型的对象,因此它可以编译。

您是否认为它应该导致编译时错误,因为您认为编译器不知道 x 的类型?

编辑

正如 Kirk Woll 评论的那样(感谢 Kirk Woll!),如果您正在检查 x 是否是一个具体类的 instanceof,编译器可以确定 x 的类型,那么你会在编译时得到一个错误。

来自 Java 语言规范:

If a cast of the RelationalExpression to the ReferenceType would be rejected as a compile-time error, then the instanceof relational expression likewise produces a compile-time error. In such a situation, the result of the instanceof expression could never be true.

举个例子:

import java.io.Serializable;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.ObjectInputStream;

class SerializableClass implements Serializable
{
private writeObject(ObjectOutputStream out) {}
private readObject(ObjectInputStream in) {}
}

public class DerivedSerializableClass extends SerializableClass
{
public static void main(String[] args)
{
DerivedSerializableClass dsc = new DerivedSerializableClass();

if (dsc instanceof DerivedSerializableClass) {} // fine
if (dsc instanceof Serializable) {} // fine because check is done at runtime
if (dsc instanceof String) {} // error because compiler knows dsc has no derivation from String in the hierarchy

Object o = (Object)dsc;
if (o instanceof DerivedSerializableClass) {} // fine because you made it Object, so runtime determination is necessary
}
}

关于java - 为什么这个 instanceof 代码可以工作并且不会导致编译时错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3897467/

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