日期:2014-05-20  浏览次数:20848 次

关于List泛型的灵异问题?
乍一看代码一坨,不过老师不要担心!我的问题只发生在里面的一小部分,很多函数不用理会。我保证很准确的描述我的问题!!!
Java code

public static void addParent() throws InterruptedException {
        Date insertTime = new Date();
        Parent parent = new Parent();
        parent.fullName = "新增家长";
        parent.fullNamePinyin = "xin zeng jia zhang";
        parent.save();        

        List<Long> parentIdFromDB = new ArrayList();
        parentIdFromDB.add(parent.id);

                /* 判断出这个List中的元素是什么类型,
                 控制台打印的信息:^^^^^parentIdFromDB.id type:class java.lang.Long
                 */
        System.out.println("^^^^^parentIdFromDB.id type:"
                + (parentIdFromDB.get(0).getClass()));

        String str_insertTime = dateTimeTranslate(insertTime);

        searchIdFromSolr(str_insertTime, parentIdFromDB);  //接着把这个List传到这个函数里面
    }
        /*
         问题其实出在这个方法的参数声明上,只要改成List<Long>就能解决问题了,
          但是请老师不要说“既然问题都解决了,还问什么?”呵呵,其实我想知道为什么,请继续往下看好吗?
        */
    public static void searchIdFromSolr(String insertTime, List idFromDB)
            throws InterruptedException {
           /*
              这里我什么也没有干,就直接把拿到的List再一次打印出里面元素的类型。
             控制台输出:@@@@@%%%idFromDB type:class java.lang.String。
              没错,到这里开始我就傻了,我怀疑这里有泛型擦除在作祟,但就算是擦除,那也是变成Object类型啊,
              怎么会是String呢???我也不太懂擦除,只是网上了解了一下...
           */
        System.out.println("@@@@@%%%idFromDB type:"
                + idFromDB.get(0).getClass());


        System.out.println("*************Begin To Sleep**************");
        Thread.sleep(5000);
        System.out.println("*************Weak Up**************");
                
        List<Long> idFromSolrSearch = SolrSearchUtils
                .getIdsFromSolrSearch(insertTime);


                /*
                 把这2个List都传入该函数
                */
        if (ListsCompare(idFromDB, idFromSolrSearch)) {
            renderJSON(new Result("测试通过!"));
        } else {
            renderJSON(new Result("测试adf不通过!"));
        }
    }

    public static boolean ListsCompare(List idFromDB, List idFromSolrSearch) {
    /*
            控制台打印信息:is idFromDB.id instanceof Long:false
         */
        for (int i = 0; i < idFromDB.size(); i++) {
            System.out.println("is idFromDB.id instanceof Long:"
                    + (idFromDB.get(i) instanceof Long));
            System.out.println(idFromDB.get(i));
        }
        /*
          控制台打印信息:is idFromSolrSearch.id instanceof Long:true
           咦!?我就奇怪了如果是擦除的话,那为什么idFromSolrSearch没有被擦除啊,还是Long类型啊!?
         */
        for (int i = 0; i < idFromSolrSearch.size(); i++) {
            System.out.println("is idFromSolrSearch.id instanceof Long:"
                    + (idFromSolrSearch.get(i) instanceof Long));
            System.out.println(idFromSolrSearch.get(i));
        }
        System.out.println("idFromDB:" + idFromDB);
        System.out.println("idFromSolrSearch:" + idFromSolrSearch);
        // if (idFromDB.containsAll(idFromSolrSearch)) {//
        // containsAll方法有问题,暂时用别的方法
        // renderJSON(new Result("一样的!"));
        // return true;
        // } else {
        // renderJSON(new Result("不一样的"));
        // return false;
        // }
        if (idFromDB.size() != idFromSolrSearch.size()) {
            return false;
        }
        for (int i = 0; i < idFromDB.size(); i++) {
            if (!idFromSolrSearch.contains(idFromDB.get(i))) { /*这里其实还要覆写equals方法才行,但这不是主题,请火眼晶晶的老师先别在意~*/
                return false;
            }
        }
        return true;
    }


问题就是这样的了,请老师帮我看看,我在网上也有学擦除,不过还不是很清楚!!

------解决方案--------------------

------解决方案--------------------
没发现问题,经测试:
打印如下:
^^^^^parentIdFromDB.id type:class java.lang.Long