黑马程序员技术交流社区

标题: 还是泛型的问题,整的我好无力 [打印本页]

作者: 孙茜茜    时间: 2013-6-18 23:56
标题: 还是泛型的问题,整的我好无力
这样子编译是出错的。
错在34行,类型错误。
虽然老师解释了,但那个解释没有说服力。
特别是看到后面上限下限的时候全混了。{:soso_e136:}

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

QQ截图20130618234949.jpg

作者: 孙茜茜    时间: 2013-6-18 23:57
少截 行数,34行就是光标上面那句printColl(al1);
楼主不能编辑真不方便啊
作者: 孙茜茜    时间: 2013-6-19 00:00
不能编辑真的好烦啊!!
说明一下,Person是Student的父类
作者: 姚志远    时间: 2013-6-19 00:12
泛型限定:
? extends E:可以接收E类型或者E的子类型。上限(限定了)
? super E:可以接受E类型或者E的父类。下限(限定了)
你这里泛型已经指定为Person了肯定就不可以再指向student了。
作者: yasyas001    时间: 2013-6-19 00:18
用反射越过泛型检查
作者: 小冰块    时间: 2013-6-19 00:18
我照着楼主的代码写了一下,顺便补了两个类的代码,运行起来完全没问题,输出的是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. }
复制代码
你看看是不是有哪里漏写了?

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

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

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

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

所以限定的时候就要说清楚,是只有父类可以,还是继承他的子类也都可以。限定的越细致安全性不就越高吗?
作者: zms2100    时间: 2013-6-19 00:50
同LS,1、把方法的接收参数以及迭代器的泛型符号换成: ? extends Person ,然后就可以了。
因为在Java中泛型参数是没有继承关系的,即Student是Person的子类也没用,只能通过泛型上下限定符来实现继承关系(这是后面高新技术视频教的内容)。
我之前是在论坛上讨论时研究出来的,2、另外如果要在方法中操作涉及参数类型的方法(例如: add()等),那么就最好将接收参数类型定义为? super Student ,
而不能定为上限符? extends Person,因为它和"?" 两个符号都是不明确数据类型。
作者: 神之梦    时间: 2013-6-19 00:56
孙茜茜 发表于 2013-6-19 00:00
不能编辑真的好烦啊!!
说明一下,Person是Student的父类

不能编辑确实很烦!!!!!!!!!!!!!!!!!!!!!!!!!!
楼主在printColl(ArrayList<? extends Person> a1)
在泛型里面加个上限就可以了
老师在解释这里为什么不行时,举了好几个例子,什么动物,猪啊,狗的,我也是听得云里雾里。。。
但事实确实是不行,所以自己根据结果来自定义原因吧,实在想不明白的话、、、、、、
俺也是在似懂非懂之中,就不卖弄了,楼主可先记住结论,等以后经验多了,说不定突然就开窍了。。。
作者: 孙百鑫    时间: 2013-6-25 00:01
楼主您好,由于帖子长时间没有动态,我已经讲帖子改成已解决了,如有问题,可以私聊我。{:soso_e100:}
作者: 张周飞    时间: 2014-7-15 10:11
来学习来了,费了半天 不错   :lol看懂了
作者: a191170796    时间: 2014-7-16 11:08
学习一下!!!
作者: 钟翠翠    时间: 2014-7-17 08:47
printColl方法打印的ArrayList数据类型是Person类的,al1集合的数据类型是Student对象,与方法不匹配,所以编译会出错




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