黑马程序员技术交流社区

标题: 关于Java泛型 [打印本页]

作者: iWilliam    时间: 2014-6-8 21:30
标题: 关于Java泛型
有这么一段代码
                List list1 = new ArrayList<String>();
                List<Integer> list2=list1;
                list1.add("2");
                list2.add(3);
                System.out.println(list2.get(0));
                System.out.println(list2.get(1));
                System.out.println(list1.get(0));
                System.out.println(list1.get(1));
                System.out.println(list1 == list2);


运行结果:
2
3
2
3
true


求大神给详细解释下~

作者: woshihq    时间: 2014-6-8 21:35
你明白引用类型吗??相当于一个指针,list1和list2是指向同一个list,所以它们操作同一个list,最后那个TRUE是因为它们比较的是地址,也就是指向同一个list的地址。
作者: 2528870651    时间: 2014-6-8 21:38
woshihq 发表于 2014-6-8 21:35
你明白引用类型吗??相当于一个指针,list1和list2是指向同一个list,所以它们操作同一个list,最后那个TR ...

我想他的问题不是侧重是不是指向同一个list,而是那个泛型<String>和<Integer>。
作者: 2528870651    时间: 2014-6-8 21:40
哎,我忙了一个月毕业论文,刚刚答辩完,今天才上论坛,好多都忘了。。
没有帮到你,不好意思。
作者: woshihq    时间: 2014-6-8 21:44
2528870651 发表于 2014-6-8 21:38
我想他的问题不是侧重是不是指向同一个list,而是那个泛型和。

我觉得从内存上分析,应该比较容易理解,但是感觉我的理解还是不太对
作者: iWilliam    时间: 2014-6-8 21:47
对,其实我想问的就是那个String和Integer的问题
作者: iWilliam    时间: 2014-6-8 21:56
2528870651 发表于 2014-6-8 21:40
哎,我忙了一个月毕业论文,刚刚答辩完,今天才上论坛,好多都忘了。。
没有帮到你,不好意思。 ...

哦,你的头像是哪个理工大学的
作者: wssjdysf    时间: 2014-6-8 21:58
我的理解是,泛型是给编译器使用的,在编译成.class文件后会进行类型擦除,在ThinkJava4里面有说,擦除后就成了List list1 = new ArrayList();和Lit list2 = list1;==比较的是地址,而他们的地址引用是一样的,加上这句话System.out.println(list1.equals(list2));我原本以为返回的应该是flase,以为equals比较的是内容嘛,但是结果为true,后来想了下应该此时List里面的是Object吧,如有不对的地方,期望下面的同学指正哈,小弟在这先谢过了
作者: 2528870651    时间: 2014-6-8 22:05
iWilliam 发表于 2014-6-8 21:56
哦,你的头像是哪个理工大学的

恩呢,武汉的
作者: 清规欲    时间: 2014-6-8 22:06
List list1 = new ArrayList<String>();    //告诉编译器list1可以存任何对象
List<Integer> list2 = list1;                //list2只能存放Integer对象或整数
作者: love~陌    时间: 2014-6-8 22:11
有这么一段代码
                List list1 = new ArrayList<String>();//父类接口指向子类对象其实应该这么写List<String> list1 = new ArrayList<String>();
                List<Integer> list2=list1;//小的这句还真的没看懂是什么意思
                list1.add("2");//这个是向集合中添加元素:字符串对象
                list2.add(3);//自动装箱动作,添加的是Integer对象
                System.out.println(list2.get(0));//获取元素,因为List集合有序
                System.out.println(list2.get(1));
                System.out.println(list1.get(0));
                System.out.println(list1.get(1));
                System.out.println(list1 == list2);


运行结果:
2
3
2
3
true

少侠,我就这么一看,怎么感觉你像是传智预热班的呢?

作者: 钟成军    时间: 2014-6-8 22:12
本帖最后由 钟成军 于 2014-6-8 22:13 编辑

你确定能运行?为什么我的会报错啊,这样写应该是不行的啊

Exception in thread "main" java.lang.Error: 无法解析的编译问题:
类型不匹配:不能从 ArrayList<String> 转换为 List
类型 List 不是通用的;不能使用参数 <Integer> 将它参数化
没有为类型 List 定义方法 get(int)
没有为类型 List 定义方法 get(int)

at itcast.cn.uploadPic.Fanxin.main(Fanxin.java:12)

作者: 钟成军    时间: 2014-6-8 22:16
钟成军 发表于 2014-6-8 22:12
你确定能运行?为什么我的会报错啊,这样写应该是不行的啊

Exception in thread "main" java.lang.Error:  ...

我的也是1.7的啊


作者: 钟成军    时间: 2014-6-8 22:22
钟成军 发表于 2014-6-8 22:16
我的也是1.7的啊

不好意思,是我导错了List包,导成了
import java.awt.List;:lol
作者: java木    时间: 2014-6-8 22:27
我郁闷了,你这样的泛型都行,有点颠覆我的java泛型认知了
作者: iWilliam    时间: 2014-6-8 22:29
java木 发表于 2014-6-8 22:27
我郁闷了,你这样的泛型都行,有点颠覆我的java泛型认知了

我也有种错觉,所以来求大神指点指点~
作者: superob123    时间: 2014-6-8 22:45
这就分编译和运行了,编译只考虑语法,运行时,泛型是被jvm去掉的,也就是运行没有泛型的概念,你语法没有错,编译不会报错的,运行时没有泛型的,张老师视频有讲。
作者: luoanjade    时间: 2014-6-8 22:45
本帖最后由 luoanjade 于 2014-6-8 22:49 编辑

学习了,这个问题,我之前没有见过!
针对你这个问题,我到网上找了一下,找到了一篇文章:Java中泛型是类型擦除的http://blog.csdn.net/hui_lang/article/details/7552564

作者: 四顾行者    时间: 2014-6-8 23:19
原来是这样
作者: 含着泪微笑    时间: 2014-11-4 20:54
学习了~~~
作者: 羽飞翔    时间: 2015-3-14 20:23
泛型擦除,,看过这篇文章才知道这个问题
作者: hello_csu    时间: 2015-4-5 18:24
http://pan.baidu.com/s/1eQ5vRIa
下载该链接文档,关于泛型部分的说明




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2