我有一个Java JUnit 4测试和一个创建通用数组的通用类。当我创建一个返回此通用数组的方法时,返回它时会出现错误消息。如果我将T实例化为Byte并将其返回到ArrayList,则可以正常工作。
为什么数组似乎已被实例化并且可用(在更复杂的类上进行了测试),但我无法返回对该数组的引用?
错误:
java.lang.ClassCastException: [Lcom.waikato.assignment.Object; cannot be cast to [Ljava.lang.Byte;
at com.waikato.testing.TestJava.test(TestJava.java:20)
类:
public class TestClass<T> {
T[] array;
@SuppressWarnings("unchecked")
public TestClass() {
array = (T[]) new Object[32];
}
public T[] getArray() {
return array;
}
public boolean doThing() {
T[] t = array;
return t == array && t != null;
}
}
测试:
public class TestJava {
@Test
public void test() {
TestClass<Byte> t = new TestClass<Byte>();
Byte[] b = t.getArray(); // Crash caused
assertTrue(t.doThing()); // Works when above line is removed.
assertTrue(b.length != 0);
}
}
Byte
除外。 - Boris StrandjevTestClass
中没有通用的方法。TestClass
本身是通用的... - Lukas EderT[]
数组,你需要以Class<T>
的形式提供T
的类型。由于<T>
本身被擦除,泛型信息在运行时不再可用。Boris提到了一个技巧,它在一些特殊情况下是有效的。但在这种情况下,它不起作用... - Lukas Eder