首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

关于List泛型的灵异有关问题

2012-04-26 
关于List泛型的灵异问题?乍一看代码一坨,不过老师不要担心!我的问题只发生在里面的一小部分,很多函数不用

关于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


@@@@@%%%idFromDB type:class java.lang.Long
*************Begin To Sleep**************
*************Weak Up**************

[解决办法]
你在List<Long> idFromSolrSearch = SolrSearchUtils
.getIdsFromSolrSearch(insertTime);

这里将idFromSolrSearch声明为List<Long>,而idFromDB没有,所以ListsCompare(List idFromDB, List idFromSolrSearch)实际传入的参数类型是不同的,你可以看下面的函数
public static void main(String[] args) throws InterruptedException{
List<Long> ll=new ArrayList();
ll.add((long) 1.0);
searchIdFromSolr("a", ll);
}
public static void searchIdFromSolr(String insertTime, List idFromDB)
throws InterruptedException {

System.out.println("@@@@@%%%idFromDB type:"
+ idFromDB.get(0).getClass());
idFromDB.add(new String("a"));
System.out.println("@@@@@%%%idFromDB type:"
+ idFromDB.get(0).getClass());
System.out.println("@@@@@%%%idFromDB type:"
+ idFromDB.get(1).getClass());
}
可见List<Long> ll在作为参数传入后得到的List idFromDB类型不再是long,不然add “a”时应该失败
[解决办法]
java 泛型的残酷现实就是:

在泛型代码内部,无法获得任何有关泛型参数类型的信息。



热点排行