gpt4 book ai didi

java - 方法不适用于参数,可能存在异常类型删除问题吗?

转载 作者:行者123 更新时间:2023-12-01 10:04:03 25 4
gpt4 key购买 nike

我正在使用 Java8,并尝试编写一个测试助手来验证抛出的异常是否属于特定类型。这是一个可行的初始版本:

private static <E extends Exception> void expectThrow(Callable<Void> callable, Class<E> exceptionClass) {
try {
callable.call();
} catch (Exception e) {
assertTrue(exceptionClass.isInstance(e));
}
}

我想做的是用 hamcrest 匹配器替换 catch block ,这样我就可以从失败中获得更多有用的信息:

        assertThat(e, Matchers.isA(exceptionClass));

但这无法编译 - 我收到这个可爱的错误:The method assertThat(T, Matcher<? super T>) in the type Assert is not applicable for the arguments (Exception, Matcher<E>)

这让我很困惑 - 这不应该起作用吗?这看起来与以下情况类似,但运行得很好:

    Integer a = 3;
assertThat(a, Matchers.isA(Number.class));

经过一番尝试后,以下方法也有效:

        assertThat((E)e, Matchers.isA(exceptionClass));

尽管这给了我一个有用的“从异常到 E 的未经检查的转换”类型的安全警告。我知道我不能catch (E e) - 类型删除和所有...

发生什么事了?如何以良好的类型安全方式更新我的测试助手?

最佳答案

这似乎是 long-standing issue 5天前终于修好了。 isA 的签名已损坏。在 Hamcrest 的下一个版本提供修复程序之前,并且在您的项目使用该版本之前,您必须使用

assertThat(e, is(instanceOf(exceptionClass)))

关于java - 方法不适用于参数,可能存在异常类型删除问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36586215/

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