有人能帮助我理解为什么我在第二个代码片段中得到“引用'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);
型
我不明白为什么它在第一个例子中起作用,但在第二个例子中却不起作用。
到现在为止,我试过什么,主要是阅读和谷歌搜索,但我仍然不明白:(
1条答案
按热度按时间kzipqqlq1#
assertDoesNotThrow
也有这个签名:<T> assertDoesNotThrow(ThrowingSupplier<T> supplier)
个这条消息是错误的,因为有一个模糊性,但不是消息解释的那个。模糊性是:应该
f::get
“fitted”作为Executable
单抽象方法接口(SAM)的示例,还是ThrowingSupplier
SAM -两者都可以完成,因此,这是模糊的。你可以通过铸造:来'修复'它,而不是:
字符串
你可以这样写:
型