我怎样才能让这个 Java instanceof 测试变成 return false 而不是错误?

How can I get this Java instanceof test to return false rather than an error?

我一直在我的 Java 代码中试验 instanceof。

public class Test {
    public static void main(String[] args) {
        String favoriteFood = "sandwich";
        boolean flag = favoriteFood instanceof StringBuilder; //incompatible types
    }
}

我从标志中得到一个错误,因为无法将 String 转换为 StringBuilder。我知道测试一个 String 来检查它是否是 StringBuilder 的一个实例是不合逻辑的,因为 String 永远不能被转换为 StringBuilder。我也明白快速失败的好处。但是,有什么办法让这个测试仍然运行而return为假呢?我查看了相关帖子,但它们更多地与为什么会出现错误有关,而不是如何处理错误。

(我知道没有实际需要这样做。我只是想知道这是否可以做到。如果可以,那怎么做?如果不能,那为什么不呢?)

最简单的方法是:

boolean flag = false;

但如果出于某种原因这对你没有吸引力,你可以写:

boolean flag = ((Object)favoriteFood) instanceof StringBuilder; // false

然后贿赂同事让它通过代码审查。

If not, then why not? 的答案是 "because the language spec says so"(请参阅 Carlos H. 的评论)。

"why does the language spec say so" 的答案是,语言定义者有这种倾向,只要有可能,就会取缔毫无意义的结构,这种倾向的灵感来自于他们的信念,即在这样做时,他们正在帮助你写出更好的代码。

编辑

回复。 "does defining a boolean as (2 + 2 == 5) make any more logical sense than ...":不,不是,但是:

(a) 语言定义者不可能(即逻辑上不可行)列出所有可以编写但没有逻辑意义的东西 (*)
(b) 这类问题归结为证明集合的空性(例如证明同时也是 StringBuilder 实例的 String 的所有可能实例的集合为空)并证明集合的空性 一般来说因为问题是NP难的。给定特定的额外信息,这可能是可能的并且有时会完成,例如给定一个类型层次结构,几乎字面意思是 "no String can also be a StringBuilder"。但是一般来说,那是不可撤销的。这就是为什么只要您不断努力搜索,总会找到案例的原因。

(*) 对于 你的 感觉 "logical sense",但你(/我们所有人)真正的意思是实际上只是 "good programming practice",其中之一是 "avoiding obfuscated ways of writing false"。这对你来说似乎违反直觉,但逻辑没有 "logical sense" 的概念。 2+2==5只是另一个逻辑命题,恰好是假的。逻辑不会抱怨谎言,它只是观察它们。

(PS 我知道我也用了 "makes no sense",不应该,但我让自己得意忘形了。)