gpt4 book ai didi

java - 为什么 Java 类型推断选择了错误的重载?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:41:57 26 4
gpt4 key购买 nike

public class MyProperties {
private Map<String, Object> properties = new HashMap<String, Object>();

public void setProperty(String name, Object value) {
properties.put(name, value);
}

@SuppressWarnings("unchecked")
public <T> T getProperty(String name) {
return (T) properties.get(name);
}
}

@Test
public void test() {
MyProperties props1 = new MyProperties();
props1.setProperty("name", "John Smith");

MyProperties props2 = new MyProperties();
props2.setProperty("name", "John Smith");

assertEquals(props2.getProperty("name"), props1.getProperty("name"));
}

上述单元测试在我的机器上通过,但在我们的 jenkins 环境中失败,并出现以下错误:

java.lang.String cannot be cast to [Ljava.lang.Object;

当通过 Eclipse 和 ant(eclipse 4.4 luna、ant 1.9.6、jdk_8_u60、Windows 7 64 位)运行时,单元测试在我的机器上通过,但在我们的 jenkins 环境(ant 1.9.6 jdk_8_u60、Ubuntu 12.04.4)中失败.它也在其他几个环境中失败,并在其他几个环境中工作——没有明显的韵律或原因。

所以我有两个问题:

1)Why is Java choosing the overload org.junit.Assert.assertEquals(Object[],Object[]) instead of org.junit.Assert.assertEquals(String,String) or org.junit.Assert.assertEquals(Object,Object)?

2) and why is the unit test passing in some environments, and failing in others with the same versions of java, ant, and junit?

最佳答案

关于 2:

不同的行为很可能不是由运行时环境引起的,而是由用于编译类的编译器引起的。

Eclipse 有自己的 Java 编译器,而 Jenkins 使用 JDK 中的 javac。

似乎是 Eclipse 4.4。生成对 assertEquals 行的调用,这允许成功的测试运行,而 javac 生成对 org.junit.Assert.assertEquals(Object[],Object[]) 的调用然后测试失败。

这在 Eclipse 4.5 中不起作用,它会在编译时提示调用已弃用的方法 Assert.assertEquals(Object[],Object[]) 并且在运行时测试也会失败 eclipse 4.5。

您可以通过反编译 Eclipse 4.4 和 javac 生成的类(使用 (javap -c) 并检查它们选择的 Assert 方法来检验假设。

关于 1:

Assert 有两个 assertEquals 方法,它们接受两个对象:

Assert.assertEquals(Object expected, Object actual);
Assert.assertEquals(Object[] expecteds, Object[] actuals);

根据JLS (15.12) 在编译方法调用时,编译器必须从所有适用的方法中选择最具体的方法。在示例中,这是 Assert.assertEquals(Object[] expecteds, Object[] actuals)

这可能会令人困惑,正因为如此,JUnit 可能决定弃用带有数组参数的方法。

关于java - 为什么 Java 类型推断选择了错误的重载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32465322/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com