У меня проблема в java, которую я не понимаю, может кто-нибудь объяснить мне это странное поведение?Java Generic Cast Error
мой код:
package com.test;
import junit.framework.TestCase;
public class MyTest extends TestCase{
class Container<I, J extends I> {
protected J data;
public J getData() {
return data;
}
@SuppressWarnings("unchecked")
public void setData(I data) {
try {
this.data = (J) data;
} catch (ClassCastException e) {
System.err.println("Cast" + e);
}
}
}
class A {
public String a = "A";
}
class B extends A {
public String B = "B";
}
class C extends A {
public String C = "C";
}
public void test1() throws Exception{
Container<A, B> container = new Container<>();
container.setData(new C());
assertNull(container.getData());
}
}
Я ожидал, что это испытание, чтобы пройти, но я получил эту ошибку:
junit.framework.AssertionFailedError: Expected: <null> but was: [email protected]
at junit.framework.Assert.fail(Assert.java:57)
at junit.framework.Assert.assertTrue(Assert.java:22)
at junit.framework.Assert.assertNull(Assert.java:277)
at junit.framework.Assert.assertNull(Assert.java:268)
at junit.framework.TestCase.assertNull(TestCase.java:438)
at com.test.MyTest.test1(MyTest.java:39)
Как это возможно, что контейнер может содержать класс C в класс В?
Кроме того, если я пытаюсь получить значение B из данных, у меня есть ClassCastException ...
public void test1() throws Exception{
Container<A, B> container = new Container<>();
container.setData(new C());
System.out.println(container.getData().B);
}
Выполнение этого теста дает эту ошибку:
java.lang.ClassCastException: com.test.MyTest$C cannot be cast to com.test.MyTest$B
at com.test.MyTest.test1(MyTest.java:39)
Спасибо, я не знаю, что я буду окружать этот бросок с тестом с использованием InstanceOf вместо попытки поймать –
@ aurélienlemaitre Нет ... просто измените подпись на 'setData (J data)'. Вы убиваете точку дженериков здесь – Dici
Упс, я не могу использовать 'instanceof', но я все еще нуждаюсь в сигнатуре, которую я использовал ... Как я могу обрабатывать плохие кавычки без' instanceof' или 'try catch'? –