如何让这个Java instanceof测试返回false而不是错误?

问题描述 投票:-2回答:2

我一直在我的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?我查看了相关的帖子,但他们更多地关注为什么会出现错误而不是做什么。

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

java instanceof typechecking
2个回答
1
投票

If not, then why not?的答案是“因为语言规范如此”(见Carlos H.的评论)。

而“为什么语言规范这么说”的答案是,语言定义者有这种趋势,禁止在任何时候都没有意义的结构,而这种倾向的灵感来自于他们的信念,即在这样做时,他们正在帮助你写作更好的代码。

编辑

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

(a)语言定义者不可能(即在逻辑上不可行)将所有可写的东西列入清单但却没有逻辑意义(*) (b)这种问题归结为证明集合的空虚(例如证明String的所有可能实例的集合也是StringBuilder的实例是空的)并证明集合的空虚作为一个问题是NP难问题。给定具体的额外信息,有可能并且有时可以完成,例如,给定一个类型层次结构,几乎字面上说“没有String也可以是StringBuilder”。但总的来说,这是可以撤销的。这就是为什么你总能找到案例,只要你继续努力搜索。

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

(PS我知道我使用“没有意义”,不应该,但我允许自己被带走。)


3
投票

最简单的方法是:

boolean flag = false;

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.