【发布时间】:2016-11-15 11:32:59
【问题描述】:
尝试fix method resolution in standalone java parser 我发现a code in mockito 我不明白。如果我基于 mockito 代码创建小测试:
package org.mockitousage.matchers;
import java.util.Collection;
public class MoreMatchersTest {
public interface IMethods {
String simpleMethod(String argument);
String simpleMethod(Collection<?> collection);
String simpleMethod(Object argument);
}
private IMethods mock;
public static <T> T any() {
return null;
}
public static <T> T verify(T m) {
return m;
}
public void any_should_be_actual_alias_to_anyObject() {
verify(mock).simpleMethod(any());
}
}
正如我所料,我遇到了编译错误:
Error:(23, 21) java: reference to simpleMethod is ambiguous
both method simpleMethod(java.lang.String) in org.mockitousage.matchers.MoreMatchersTest.IMethods and method simpleMethod(java.util.Collection<?>) in org.mockitousage.matchers.MoreMatchersTest.IMethods match
但不知何故,mockito 编译成功。您能否解释一下为什么 mockito 中的代码编译(以及 <T>any 编译器选择的专业化)或如何修改我的示例以便它也可以编译(我知道我可以将 any() 转换为特定类型或删除 @ 的重载987654329@ 但我想尽可能接近模拟代码)。
命令行输出:
> javac -version
javac 1.8.0_111
> javac -d C:\w\MockitoTest\out\production\MockitoTest -classpath C:\w\MockitoTest\out\production\MockitoTest -sourcepath C:\w\MockitoTest\src -g -source 8 -target 8 C:\w\MockitoTest\src\org\mockitousage\matchers\MoreMatchersTest.java
C:\w\MockitoTest\src\org\mockitousage\matchers\MoreMatchersTest.java:23: error: reference to simpleMethod is ambiguous
verify(mock).simpleMethod(any());
^
both method simpleMethod(String) in IMethods and method simpleMethod(Collection<?>) in IMethods match
1 error
> javac -d C:\w\MockitoTest\out\production\MockitoTest -classpath C:\w\MockitoTest\out\production\MockitoTest -sourcepath C:\w\MockitoTest\src -g -source 7 -target 7 C:\w\MockitoTest\src\org\mockitousage\matchers\MoreMatchersTest.java
warning: [options] bootstrap class path not set in conjunction with -source 1.7
1 warning
【问题讨论】:
-
“你能解释一下为什么mockito compile中的代码”你指的是哪个代码?代码和你的不一样。
-
好吧,Java 8 中的类型推断得到了大修,JLS 中的一章docs.oracle.com/javase/specs/jls/se8/html/jls-18.html。在 Java 8 之前,推断类型应该是 Object,但在版本 8 中似乎更复杂
-
@borys-zibrov 我添加了来自 oracle jdk 8 update 111 的 javac 输出
-
@borys-zibrov - 我正在使用来自 git master 的版本,但你是对的 - mockito_main 和 mockito_test 模块使用 Java 6 语言级别(所有其他模块和项目本身使用 Java 8,我只检查了之前的项目本身) - 你能添加一个答案,我会接受它。