有什么可以警告我不要 type.equals(incompatibleType)吗?

2022-09-04 22:13:57

是否有任何工具可以警告我以下类型的代码:

if ( someClass.equals( someString ))

例如:

if ( myObject.getClass().equals( myClassName ))

这样的事情是合法的Java(等于接受一个对象),但永远不会计算为true(一个类永远不能等于一个字符串),所以几乎肯定是一个错误。

我已经检查了Eclipse,FindBugs和PMD,但似乎没有人支持此功能?


答案 1

是的,IntelliJ IDEA有这样的检查,我相信默认情况下是启用的。它标记以下内容:

Class<?> clazz = String.class;
if (clazz.equals("foo")) {
   //...
}

带有警告:

不可转换类型的对象之间的“equals()”。

可以通过“设置->项目设置->”检查“来启用/禁用检查,然后在”可能的错误“下选中/取消选中”不可转换类型的对象之间的'equals()'”。

FindBugs也应该通过“EC:调用 equals() 比较不同类型的”错误检查来捕获这一点。它可以与 Eclipse 集成,因为它看起来是你所知道的。

不过,两者都不是银弹。他们无法读懂你的心思。您可以期望的最好的结果是,它将有利于误报而不是假阴性。


答案 2

这就是 .NET 中接口背后的思想:为类型提供一种机制来实现我称之为强类型相等的内容。还有一个接口,用于允许此逻辑在单独的类型中实现。IEquatable<T>IEqualityComparer<T>

根据这个StackOverflow问题(由Jon Skeet回答,他通常似乎知道他在说什么),Java中似乎没有任何等同的东西。

当然,你总是可以自己为自己的类型实现这样的东西,但是对于作为Java基类库一部分的类型,它不会对你有多大好处。对于此类问题的编译时检测,您最好的选择是某种分析工具(Mark Peters表示IntelliJ IDEA中显然内置了一个分析工具),它可以向您建议某些代码可能是可疑的。一般来说,假设你不是一个无视警告的人,这应该足够好了。


推荐