繁体   English   中英

我怎样才能让这个 Java instanceof 测试返回 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
    }
}

我从 flag 收到错误,因为 String 无法转换为 StringBuilder。 我知道测试 String 以检查它是否是 StringBuilder 的实例是不合逻辑的,因为 Strings 永远不能被转换为 StringBuilders。 我也理解快速失败的好处。 但是,有没有办法仍然运行此测试并返回 false? 我看过相关的帖子,但它们更多地与错误的原因有关,而不是如何处理。

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

最简单的方法是:

boolean flag = false;

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

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

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

If not, then why not? 是“因为语言规范是这样说的”(参见 Carlos H. 的评论)。

而“为什么语言规范这么说”的答案是语言定义者有这种倾向,只要他们可以,就禁止毫无意义的结构,这种倾向受到他们的信念的启发,即这样做,他们是在帮助你编写更好的代码。

编辑

关于。 “将布尔值定义为 (2 + 2 == 5) 是否比...更具逻辑意义”:不,它没有,但是:

(a) 语言定义者不可能(即逻辑上不可行)盘点所有可以编写但没有逻辑意义的东西 (*)
(b) 这种问题归结为证明一个集合的空性(例如证明所有可能的 String 实例的集合也是 StringBuilder 的实例是空的)并且证明一个集合的空性一般是一个问题NP难。 给定特定的额外信息,这可能是可能的,有时也是这样做的,例如,给定一个类型层次结构,几乎字面意思是“没有 String 也可以是 StringBuilder”。 总的来说,这是可以撤销的。 这就是为什么只要你足够努力地搜索,你总能找到案例。

(*) 对于的“逻辑感”,但您(/我们所有人)真正的意思是,实际上只是“良好的编程实践”,其中之一是“避免编写false混淆方式”。 这对您来说可能看起来违反直觉,但逻辑没有“逻辑意义”的概念。 2+2==5只是另一个逻辑命题,它恰好是错误的。 逻辑不会抱怨谎言,它只是观察它们。

(PS 我知道我也用了“毫无意义”,不应该,但我让自己得意忘形。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM