AssertEquals не работает без второго параметрирования

Люди, почему я получаю "Метод assertEquals (String, Object, Object) неоднозначен для ошибки типа DictionaryTest для этого теста JUnit?

@Test
 public void testEditCard() {
  Integer a = 10;
  Integer b = 12;
  Integer c = 2;
  assertEquals("test", a-b, c);
 }

Добавление кастинга assertEquals("test", (Integer)(a-b), c); устраняет проблему.

Ответ 1

Из-за чудес автобоксинга и -unboxing:

assertEquals("test", /* this is an int */ a-b, /* this is an Integer */ c);

Может быть оценен как

assertEquals(String, long, long);
// in this case the second parameter is unboxed
// (and the first one silently casted)

или

assertEquals(String, Object, Object);
// in this case the first parameter is boxed

Если вы объявляете все переменные как int (не Integer), не должно быть двусмысленности.

Ответ 2

Это потому, что компилятор не может определить, хотите ли вы вызвать assertEquals(String, Object, Object) или assertEquals(String, long, long). Поскольку a-b и c могут быть автоматически принудительно привязаны к long, компилятор видит двусмысленность.

Ваше явное приведение говорит компилятору, что вы хотите версию Object.

Обратите внимание, что в этом случае вы могли бы использовать переменные int, а не Integer, которые также фиксировали бы двусмысленность.