Java标识通用容器元素类型

时间:2018-02-27 17:20:33

标签: java generics

我想要实现的是通用列表的映射,然后我可以序列化。我已经实现了这一点,但可能不是最好的方式,无论如何我不明白我在下面进一步描述的一点。 基本上我不知道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]);
        }
      }

    }

0 个答案:

没有答案