关于List泛型的灵异问题?

SelfMedicated 2012-02-21 04:20:44
乍一看代码一坨,不过老师不要担心!我的问题只发生在里面的一小部分,很多函数不用理会。我保证很准确的描述我的问题!!!

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;
}

问题就是这样的了,请老师帮我看看,我在网上也有学擦除,不过还不是很清楚!!
...全文
139 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
SelfMedicated 2012-02-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 notonlyforshe 的回复:]
java 泛型的残酷现实就是:

在泛型代码内部,无法获得任何有关泛型参数类型的信息。
[/Quote]
晕呀~这个我在网上看过了
莫欺少年穷 2012-02-21
  • 打赏
  • 举报
回复
java 泛型的残酷现实就是:

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



SelfMedicated 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 abstruct 的回复:]

没发现问题,经测试:
打印如下:
^^^^^parentIdFromDB.id type:class java.lang.Long
@@@@@%%%idFromDB type:class java.lang.Long
*************Begin To Sleep**************
*************Weak Up**************
[/Quote]
是的,如果自己写一个测试,是不会出问题的,比如:
public class testDateTime {

public static void main(String args[]) {
List<Long> longTypeList = new ArrayList();
longTypeList.add(1L);
System.out.println("In main method");
System.out.println("is longType.id instanceof Long:"
+ (longTypeList.get(0) instanceof Long));
test1("nothing", longTypeList);
}

public static void test1(String str, List longTypeList) {
System.out.println("longTypeList.id type:"
+ (longTypeList.get(0).getClass()));
}
}
但是我上面的问题就不知道是为什么了???
影竹 2012-02-21
  • 打赏
  • 举报
回复
你在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”时应该失败
安特矮油 2012-02-21
  • 打赏
  • 举报
回复
没发现问题,经测试:
打印如下:
^^^^^parentIdFromDB.id type:class java.lang.Long
@@@@@%%%idFromDB type:class java.lang.Long
*************Begin To Sleep**************
*************Weak Up**************
shixitong 2012-02-21
  • 打赏
  • 举报
回复

51,409

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧