这与您链接的问题完全无关,该问题是关于解决错误的静态分析器并被正确拒绝的。您遇到的问题在 Java 中混合基本类型时很常见。
为了避免输入L
你必须提供所有匹配器的重载版本——而不仅仅是is
。考虑这些例子:
assertThat(longValue, greaterThan(1));
assertThat(longList, contains(1, 2, 3));
Update
您可以轻松添加自己的重载版本来执行转换:
public static Matcher<Long> is(Integer value) {
return org.hamcrest.core.Is.is(value.longValue());
}
当然,既然你已经有了一个可以转换的int
to long
你会想要一些float
and double
:
public static Matcher<Long> is(Float value) {
return org.hamcrest.core.Is.is(value.longValue());
}
public static Matcher<Long> is(Double value) {
return org.hamcrest.core.Is.is(value.longValue());
}
由于 Java 不会自动转换为byte
to Integer
*,您还需要以下版本byte
and short
。这已经够难看的了,但是如果转换为其他类型呢?int
to double
?
public static Matcher<Double> is(Integer value) {
return org.hamcrest.core.Is.is(value.doubleValue());
}
编译错误:重复方法为(Integer)
呃哦!这些不起作用,因为 Java 不允许您根据返回类型重载方法。您必须在我留给您的单独的类中声明这些方法。
考虑到这会造成巨大的混乱,我怀疑 Hamcrest 的作者会愿意接受这样的添加,因为回报很低。老实说,你最好使用明确的方式1L
and 1.0
如所须。
* 虽然编译器will转换自byte
to int
可以装箱到Integer
.