我一直在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永远不能转换为StringBuilders。我也了解快速失败的好处。但是,有什么方法仍然可以运行此测试并返回false?我看过相关的文章,但是它们更多地与为什么有错误有关,而不是如何处理。
(我知道实际上没有必要这样做。我只是想知道是否可以这样做。如果可以,那么如何?如果不能,那么为什么不可以?)
答案 0 :(得分:3)
最简单的方法是:
boolean flag = false;
但是,如果由于某种原因对您没有吸引力,您可以写:
boolean flag = ((Object)favoriteFood) instanceof StringBuilder; // false
然后贿赂同事,让其过去的代码进行审查。
答案 1 :(得分:1)
If not, then why not?
的答案是“因为语言规范如此规定”(请参见Carlos H.的评论)。
“语言规范为什么会这么说”的答案是,语言定义者倾向于取缔在任何可能的时候都没有意义的结构,而这种趋势是由于他们相信这样做有助于他们的。您编写更好的代码。
编辑
re。 “将布尔值定义为(2 + 2 == 5)比...具有更多的逻辑意义”:不,不是,但是:
(a)语言定义者不可能(在逻辑上不可行)对所有可以写但没有逻辑意义的东西进行盘点(*)
(b)这种问题归结为证明集合的空性(例如,证明也是StringBuilder实例的所有可能的String实例的集合为空),并证明集合 的空性一般来说 ,因为问题是NP难题。给定特定的额外信息,这可能是可能的并且有时会完成,例如给定一个几乎按字面意义说“没有字符串也可以是StringBuilder”的类型层次结构。但是 一般 ,这是不可撤消的。这就是为什么只要您不断努力就可以找到案例的原因。
(*)对于 您 的“逻辑意义”,但是您(/我们所有人)真正的意思是,实际上只是“良好的编程习惯”,其中将是“避免混淆的false
书写方式”。这对您来说似乎违反直觉,但是逻辑没有“逻辑意义”的概念。 2+2==5
只是另一个逻辑命题,它恰好是错误的。逻辑并不抱怨虚假,而只是观察虚假。
(我知道我也使用过“毫无意义”的PS,应该不会,但是我让自己迷失了方向。)