我想要实现的是通用列表的映射,然后我可以序列化。我已经实现了这一点,但可能不是最好的方式,无论如何我不明白我在下面进一步描述的一点。 基本上我不知道mClass最终会如何成为" [Ljava.lang.Integer"即Integer []而不仅仅是" java.lang.Integer"。
编辑:为了清楚我的问题。当我使用GenericArrayData<实例化类时,我不明白为什么mClass是 Integer [] 。整数>,即我期待整数。感谢
import java.util.HashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import junit.framework.Assert;
import org.junit.Test;
public class TestDataCollectorTest {
public class GenericArrayData<T> {
public Class mClass;
public CopyOnWriteArrayList<T[]> data;
public GenericArrayData(Class<T> type) {
mClass = type;
data = new CopyOnWriteArrayList<>();
}
}
public <T> void logGenericArrayData(HashMap<String, GenericArrayData> map, String tag, T[] obj) {
if (map.containsKey(tag)) {
GenericArrayData<T> d = map.get(tag);
d.data.add(obj);
return;
}
System.out.println("Adding log entry named\"" + tag + "\"");
Class k = obj.getClass();
GenericArrayData<T> d = new GenericArrayData<T>(k);
d.data.add(obj);
map.put(tag, d);
}
@Test
public void basics() {
HashMap<String, GenericArrayData> map = new HashMap<>();
GenericArrayData<Integer> list = new GenericArrayData<>(Integer.class);
Integer[][] inputData = new Integer[10][10];
for (int i = 0; i < inputData.length; ++i) {
inputData[i] = new Integer[10];
for (int j = 0; j < inputData[0].length; ++j) {
inputData[i][j] = i * 100 + j;
}
logGenericArrayData(map, "integers", inputData[i]);
}
Assert.assertEquals(1, map.size());
GenericArrayData d = map.get("integers");
Assert.assertEquals(10, d.data.size());
System.out.println(d.mClass);
Integer[] ia = new Integer[0];
System.out.println(ia.getClass());
Assert.assertTrue(ia.getClass() == d.mClass); // I don't quite understand
Integer[][] outputData = new Integer[d.data.size()][];
outputData = (Integer[][]) d.data.toArray(outputData);
Assert.assertEquals(inputData.length, outputData.length);
for (int i = 0; i < inputData.length; ++i) {
Assert.assertEquals(inputData[i], outputData[i]);
}
}
}