java 为什么我得到这个错误“引用'get'是模糊的,'get()'和'get(long,TimeUnit)'匹配”

sqyvllje  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(57)

有人能帮助我理解为什么我在第二个代码片段中得到“引用'get'是模糊的,'get()'和'get(long,TimeUnit)'匹配”错误,而不是在第一个代码片段中?
assertThrows(jUnit5)的方法签名如下:

public static <T extends Throwable> T assertThrows(Class<T> expectedType, Executable executable);

// and executable is 

@FunctionalInterface
public interface Executable {
    void execute() throws Throwable;
}

字符串
在这里,马云并没有抱怨。

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import static org.junit.jupiter.api.Assertions.assertThrows;

  @Test
  void testOK() {
    Callable<String> callable = () -> {return "test";};

    FutureTask<String> futureTask = new FutureTask<>(callable);
    new Thread(futureTask).start();

    assertThrows(ExecutionException.class, futureTask::get); // waits for thread to finish
  }


然而在这里,

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;

@Test
  void testNotOK() {
    Callable<String> callable = () -> {return "test";};

    FutureTask<String> futureTask = new FutureTask<>(callable);
    new Thread(futureTask).start();

    assertDoesNotThrow(futureTask::get); // waits for thread to finish
  }


“futureTask::get”在这里似乎是模糊的,“get()”和“get(long,TimeUnit)”都匹配,尽管assertDoesNotThrow也接受Executable作为参数。

public static void assertDoesNotThrow(Executable executable);


我不明白为什么它在第一个例子中起作用,但在第二个例子中却不起作用。
到现在为止,我试过什么,主要是阅读和谷歌搜索,但我仍然不明白:(

kzipqqlq

kzipqqlq1#

assertDoesNotThrow也有这个签名:
<T> assertDoesNotThrow(ThrowingSupplier<T> supplier)
这条消息是错误的,因为有一个模糊性,但不是消息解释的那个。模糊性是:应该f::get“fitted”作为Executable单抽象方法接口(SAM)的示例,还是ThrowingSupplier SAM -两者都可以完成,因此,这是模糊的。
你可以通过铸造:来'修复'它,而不是:

assertDoesNotThrow(futureTask::get);

字符串
你可以这样写:

assertDoesNotThrow((Executable) futureTask::get);

相关问题