A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙茜茜 中级黑马   /  2013-6-18 23:56  /  2536 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这样子编译是出错的。
错在34行,类型错误。
虽然老师解释了,但那个解释没有说服力。
特别是看到后面上限下限的时候全混了。{:soso_e136:}

QQ截图20130618234949.jpg (57.8 KB, 下载次数: 0)

QQ截图20130618234949.jpg

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

17 个回复

倒序浏览
少截 行数,34行就是光标上面那句printColl(al1);
楼主不能编辑真不方便啊
回复 使用道具 举报
不能编辑真的好烦啊!!
说明一下,Person是Student的父类
回复 使用道具 举报

回帖奖励 +5

泛型限定:
? extends E:可以接收E类型或者E的子类型。上限(限定了)
? super E:可以接受E类型或者E的父类。下限(限定了)
你这里泛型已经指定为Person了肯定就不可以再指向student了。
回复 使用道具 举报

回帖奖励 +5

用反射越过泛型检查
回复 使用道具 举报

回帖奖励 +5

我照着楼主的代码写了一下,顺便补了两个类的代码,运行起来完全没问题,输出的是hash码(ps:如果想通过sop输出内容建议重写toSting函数)
  1. import java.util.*;
  2. class  Test2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 ArrayList<Person> al = new ArrayList<Person>();

  7.                 al.add(new Person("abc1"));
  8.                 al.add(new Person("abc2"));
  9.                 al.add(new Person("abc3"));
  10.                 al.add(new Person("abc4"));
  11.                 System.out.println(al);

  12.                 ArrayList<Student> al1 = new ArrayList<Student>();
  13.                 al1.add(new Student("abc1"));
  14.                 al1.add(new Student("abc2"));
  15.                 al1.add(new Student("abc3"));
  16.                 al1.add(new Student("abc4"));
  17.                
  18.                 System.out.println(al1);
  19.         }
  20. }

  21. class Person
  22. {
  23.         private String name;
  24.         Person(String str)
  25.         {
  26.                 name = str;
  27.         }
  28.         Person()
  29.         {}
  30.                        //get函数我不写了……
  31. }

  32. class Student extends Person
  33. {
  34.         private String name;
  35.         Student(String str)
  36.         {
  37.                 name = str;
  38.         }
  39. }
复制代码
你看看是不是有哪里漏写了?

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 不错

查看全部评分

回复 使用道具 举报
啊,顺便说一句,如果楼主说的类型异常是指ClassCastException的话,我觉得错误应该出在你自己定义的输出函数上,你可以看一下。
回复 使用道具 举报
刚看到下面还有输出函数= =……错误在你的迭代器上,你明确的定义了迭代器的泛型是Person,用来遍历Student当然会出错……不能编辑真烦= =
回复 使用道具 举报
小冰块 发表于 2013-6-19 00:18
我照着楼主的代码写了一下,顺便补了两个类的代码,运行起来完全没问题,输出的是hash码(ps:如果想通过so ...

你这样是每个集合独自打印 System.out.println(),没体现泛型的特点
我想问的就是封装起来的打印方法传入泛型参数的问题
回复 使用道具 举报
小冰块 发表于 2013-6-19 00:27
刚看到下面还有输出函数= =……错误在你的迭代器上,你明确的定义了迭代器的泛型是Person,用来遍历Student ...

Person是Student的父类,为什么还是不行呢
回复 使用道具 举报
是父类所以要用“? extend Person”,不然的话,要泛型限定做什么,所有子类不都想用就用了吗?还怎么限定范围?之前我们所见到的向上转型向下转型都出现在多态中,父类引用指向子类对象,但这里并没有用到多态,这是jvm规定的泛型规则,所以自然不可以。
回复 使用道具 举报
因为list的特性是可以放入任何对象,所以不管你放什么编译时都不会出错,所以我们使用泛型的目的就是将运行时期的错误提前到编译时期,增强安全性。

有时候你可能仅仅想接受父类,而不想接受子类,如果使用父类限定而所有子类都可以进来的话,如果你在后期调用到了子类特有的方法呢?提前报错还有用吗?

所以限定的时候就要说清楚,是只有父类可以,还是继承他的子类也都可以。限定的越细致安全性不就越高吗?
回复 使用道具 举报

回帖奖励 +5

同LS,1、把方法的接收参数以及迭代器的泛型符号换成: ? extends Person ,然后就可以了。
因为在Java中泛型参数是没有继承关系的,即Student是Person的子类也没用,只能通过泛型上下限定符来实现继承关系(这是后面高新技术视频教的内容)。
我之前是在论坛上讨论时研究出来的,2、另外如果要在方法中操作涉及参数类型的方法(例如: add()等),那么就最好将接收参数类型定义为? super Student ,
而不能定为上限符? extends Person,因为它和"?" 两个符号都是不明确数据类型。
回复 使用道具 举报

回帖奖励 +5

孙茜茜 发表于 2013-6-19 00:00
不能编辑真的好烦啊!!
说明一下,Person是Student的父类

不能编辑确实很烦!!!!!!!!!!!!!!!!!!!!!!!!!!
楼主在printColl(ArrayList<? extends Person> a1)
在泛型里面加个上限就可以了
老师在解释这里为什么不行时,举了好几个例子,什么动物,猪啊,狗的,我也是听得云里雾里。。。
但事实确实是不行,所以自己根据结果来自定义原因吧,实在想不明白的话、、、、、、
俺也是在似懂非懂之中,就不卖弄了,楼主可先记住结论,等以后经验多了,说不定突然就开窍了。。。
回复 使用道具 举报

回帖奖励 +5

楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。{:soso_e100:}
回复 使用道具 举报

回帖奖励 +5

来学习来了,费了半天 不错   :lol看懂了
回复 使用道具 举报

回帖奖励 +5

学习一下!!!
回复 使用道具 举报
printColl方法打印的ArrayList数据类型是Person类的,al1集合的数据类型是Student对象,与方法不匹配,所以编译会出错
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马