首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >泛型和ClassCastException:为什么我会得到这个异常,我如何“绕过”它呢?

泛型和ClassCastException:为什么我会得到这个异常,我如何“绕过”它呢?
EN

Stack Overflow用户
提问于 2014-05-04 17:46:29
回答 1查看 301关注 0票数 1

对于我的一个项目,我试图摆脱基于字符串的单元测试;我现在作为目标的一个类是ParsingResult

我已经成功地转换了另一个具有自定义AssertJ断言的类,因此我现在试图为下一个“受害者”编写一个自定义断言类。这门课是这样的:

代码语言:javascript
复制
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);
    }
}

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

代码语言:javascript
复制
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的行中,它失败如下:

代码语言:javascript
复制
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)
    [...]

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

代码语言:javascript
复制
            resultAssert = ParsingResultAssert.assertResult(result);

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

代码语言:javascript
复制
  // 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();
  }

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

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-04 17:57:43

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23459518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档