[英]Why does `instanceof` error rather than return `false` when used for 2 incompatible classes?
[英]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.