根据我对JLS的阅读,重载分辨率
Assert.assertEquals(1,1L)
应解析为
Assert.assertEquals(long, long)
简而言之,问题中的代码片段不是实际问题的有效示例。
(对于记录,,和可以通过严格调用来应用,第一个是最具体的;请参阅 JLS 15.12.2.2。严格的调用上下文允许原始加宽,但不允许装箱或取消装箱。assertEquals(long, long)
assertEquals(float, float)
assertEquals(double, double)
如果(如证据所示)您的调用解析为 ,则意味着其中一个操作数必须已经是盒装类型。该重载的问题在于它使用该方法来比较对象,并且该方法的协定指定结果是对象的相应类型是否不同。Assert.assertEquals(Object, Object)
equals(Object)
false
如果这就是你真正的代码中发生的事情,那么我怀疑使用的建议是否有效。匹配器等同于后者依赖于...is(T)
Matcher
is(T)
is(equalTo(T))
equals(Object)
有没有现有的“好方法”?
AFAIK,没有。
我认为真正的解决方案是更加关注类型;例如:
int i = 1;
Long l = 1L;
Assert.assertEquals(i, l); // Fails
Assert.assertEquals((long) i, l); // OK - assertEquals(Object, Object)
Assert.assertEquals((Long) i, l); // OK - assertEquals(Object, Object)
Assert.assertEquals(i, (int) l); // OK - assertEquals(long, long)
// it would bind to an (int, int)
// overload ... it it existed.
Assert.assertEquals(i, (long) l); // OK - assertEquals(long, long)
编写自定义也可以。Matcher