gpt4 book ai didi

java - 泛型和 ClassCastException : why do I get this exception, 我该如何处理 "work around"呢?

转载 作者:行者123 更新时间:2023-11-30 03:54:58 24 4
gpt4 key购买 nike

对于one of my projects ,我试图摆脱基于字符串的单元测试;我现在作为目标的一类是 ParsingResult .

我已成功使用自定义 AssertJ 转换另一个类断言,所以我现在尝试为我的下一个“受害者”编写一个自定义断言类。类(class)是这样的:

public final class ParsingResultAssert<V>
extends AbstractAssert<ParsingResultAssert<V>, ParsingResult<V>>
{
private ParsingResultAssert(final ParsingResult<V> actual)
{
super(actual, ParsingResult.class);
}

public static <E> ParsingResultAssert<E> assertResult(
final ParsingResult<E> actual)
{
return new ParsingResultAssert<E>(actual);
}
}

为了测试它,我想尝试将其插入到我最终想要删除的测试文件中:

public abstract class ParboiledTest<V> {

public class TestResult<V> {
public final ParsingResult<V> result;
private final ParsingResultAssert<V> resultAssert;

public TestResult(ParsingResult<V> result) {
this.result = result;
resultAssert = ParsingResultAssert.assertResult(result); // HERE
}
// rest is not relevant

在标记为 HERE 的行处它失败了:

java.lang.ClassCastException
at java.lang.Class.cast(Class.java:2999)
at org.assertj.core.api.AbstractAssert.<init>(AbstractAssert.java:63)
at com.github.parboiled1.grappa.assertions.ParsingResultAssert.<init>(ParsingResultAssert.java:13)
at com.github.parboiled1.grappa.assertions.ParsingResultAssert.assertResult(ParsingResultAssert.java:19)
at org.parboiled.test.ParboiledTest$TestResult.<init>(ParboiledTest.java:42)
[...]

堆栈跟踪的最后一行是这一行:

            resultAssert = ParsingResultAssert.assertResult(result);

org.assertj.core.api.AbstractAssert.<init>(AbstractAssert.java:63)是这样的:

  // we prefer not to use Class<? extends S> selfType because it would force inherited
// constructor to cast with a compiler warning
// let's keep compiler warning internal (when we can) and not expose them to our end users.
@SuppressWarnings("unchecked")
protected AbstractAssert(A actual, Class<?> selfType) {
myself = (S) selfType.cast(this); // <-- THIS ONE
this.actual = actual;
info = new WritableAssertionInfo();
}

但我迷路了;我不明白为什么会发生这种情况。我已经成功编写了两个自定义断言( herehere ),但这是我第一次看到此错误;这里唯一的区别是,我尝试为其创建断言类的类有一个类型参数。

我错过了什么?

最佳答案

您正在尝试将 ParsingResultAssert 强制转换为 ParsingResult 类。 super 构造函数的第二个参数应该是 ParsingResultAssert.class,而不是 ParsingResult.class

关于java - 泛型和 ClassCastException : why do I get this exception, 我该如何处理 "work around"呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23459518/

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