gpt4 book ai didi

java - 类型推断在 Java 中是如何工作的,或者为什么 mockito 甚至可以编译

转载 作者:行者123 更新时间:2023-11-29 04:37:39 26 4
gpt4 key购买 nike

尝试 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() 转换为特定类型或删除 simpleMethod 的重载但我想尽可能接近 mockito 代码)。

命令行输出:

> 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

最佳答案

在这种情况下,您不需要指定类型,因为编译器绑定(bind)到 Object。

这一行

 verify(mock).simpleMethod(any()); // bind to simpleMethod(Object)

使用 Java 8 update 101,它编译得很好(mockito 和你的例子)。

关于java - 类型推断在 Java 中是如何工作的,或者为什么 mockito 甚至可以编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40608813/

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