Generics и ClassCastException: почему я получаю это исключение, как мне его "обойти"?
В одном из моих проектов я пытаюсь избавиться от модульного тестирования на основе строк; один класс у меня в качестве цели сейчас ParsingResult
,
Я успешно преобразовал другой класс с пользовательским утверждением AssertJ, поэтому сейчас я пытаюсь написать собственный класс утверждения для моей следующей "жертвы". Класс идет так:
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();
}
Но я потерян; Я не могу понять, почему это происходит. Я уже успешно написал два пользовательских утверждения ( здесь и здесь), но впервые вижу эту ошибку; единственное отличие здесь в том, что в классе есть параметр типа, для которого я пытаюсь создать класс утверждения.
Что мне не хватает?
1 ответ
Вы пытаетесь разыграть ParsingResultAssert
к классу ParsingResult
, Второй аргумент super
конструктор должен быть ParsingResultAssert.class
не ParsingResult.class
,