我有以下描述元组的类,为此使用lombok
:
@Data
public class Pair<K, V> {
private final K key;
private V value;
}
然后我想使用JUnit
来为此课程编写一个测试,如下所示:
public class PairTest {
@Test
void pairCanBeCreatedAndHoldIntegerValues() {
Pair<Integer,Integer> myTestPair = new Pair<Integer, Integer>(0);
myTestPair.setValue(5);
assertEquals(5, myTestPair.getValue());
assertEquals(0, myTestPair.getKey());
}
}
尽管lombok自动生成的get方法应该返回一个int
,但我仍然看到我的IDE抱怨:
Error:(12, 9) java: reference to assertEquals is ambiguous
both method assertEquals(java.lang.Object,java.lang.Object) in org.junit.jupiter.api.Assertions and method assertEquals(int,int) in org.junit.jupiter.api.Assertions match
尽管我知道,assertEquals
期望有两个int
,我正在提供。
如何在Java
中做到这一点?
答案 0 :(得分:4)
该行为的原因称为autoboxing\unboxing。
自动装箱是Java编译器进行的自动转换 在原始类型及其对应的对象包装器之间 类。例如,将int转换为Integer,将double转换为a 双重,依此类推。如果转换结果相反,这是 称为拆箱。
myTestPair
对象返回Integer
的包装int
,因此编译器不知道使用哪种重载方法:assertEquals(Object, Object)
或assertEquals(int, int)
。您需要让编译器知道它,使用:
assertEquals(5, myTestPair.getValue().intValue());
assertEquals(0, myTestPair.getKey().intValue());
或
assertEquals((Integer)5, myTestPair.getValue());
assertEquals((Integer)0, myTestPair.getKey());
或
assertEquals(Integer.valueOf(5), myTestPair.getValue());
assertEquals(Integer.valueOf(0), myTestPair.getKey());