黑马程序员技术交流社区

标题: java泛型问题 [打印本页]

作者: 于星星    时间: 2012-7-14 21:08
标题: java泛型问题
本帖最后由 于星星 于 2012-7-17 10:25 编辑
  1. public class GenericTest {
  2. public static void main(String[] args) {
  3. GenericTest gt= new GenericTest ();
  4. GenericShow gs = new GenericShow ();
  5. gs.setA("对GenericShow类中方法的调用");
  6. gt.fun(gs);
  7. }
  8. public static void fun(GenericShow <? extends Number> c) {
  9. System.out.println(c.getA());
  10. }
  11. }
  12. class GenericShow<D> {
  13. private D a;

  14. public D getA() {
  15. return a;
  16. }

  17. public void setA(D a) {
  18. this.a = a;
  19. }
  20. }
复制代码
在gs.setA("对ShowGeneric类中方法的调用"); gt.fun(b);实参b为什么能够成功的传给public static void fun(ShowGeneric<? extends Number> c) 形参c;
作者: 黑马-王言龙    时间: 2012-7-14 21:26
没看懂,b哪来的?
作者: 许瑞航老师    时间: 2012-7-14 21:50
泛型不能这么写


泛型类创建对象的时候一定要确定类型,不然会出"未经检查"的警告
GenericShow gs = new GenericShow ();

如果gs对象的泛型确定类型为String
gt.fun(gs); 会报错



如果gs泛型确定为Number或其子类
gs.setA("对GenericShow类中方法的调用"); 会报错
作者: 周刚    时间: 2012-7-14 22:56
我顶!哈哈
作者: 刘笑    时间: 2012-7-14 23:03
周刚 发表于 2012-7-14 22:56
我顶!哈哈

哈哈哈哈
作者: 侯茂绵    时间: 2012-7-14 23:08
{:soso_e103:}继续顶
作者: 黑马刘涛    时间: 2012-7-14 23:12
  1. void fun(GenericShow <? extends Number> c)/*? extends Number表示该类型为Number任何已实现的子类类型*/

  2. gt.fun(gs); gs类型为GenericShow类型,形参c就是GenericShow类型,因此传递的实参没有不妥

复制代码

作者: 柯玲    时间: 2012-7-15 00:50
综合观察,示例可以简化解释如下:
  1. public class GenericTest {
  2.         public static void fun(GenericShow <? extends Number> c) { //此刻限定了GenericShow操作类型为 <? extends Number>
  3.             System.out.println(c.getD());
  4.         }
  5.         public static void main(String[] args) {
  6.                 GenericShow gs = new GenericShow ();
  7.                 gs.setD("对GenericShow类中方法的调用");
  8.                 fun(gs); //等同于同类型对象赋值,将类型限定联系起来,以此判断GenericShow的操作类型为 <? extends Number>
  9.         }
  10. }
  11. class GenericShow<D> { //D是不明确的类型,此时就相当于通配符?,由此知道任意类型都可以传入作限定,可以在调用或者创建此类对象时进行限定
  12.     private D d;
  13.         public D getD() {
  14.         return d;
  15.         }
  16.         public void setD(D d) {
  17.         this.d = d;
  18.         }
  19. }
复制代码
综上不难理解gs能顺利将值传给c的原因
作者: 柯玲    时间: 2012-7-15 22:50
本帖最后由 柯玲 于 2012-7-16 06:54 编辑

今天看了泛型的高新视频,gs能顺利传给c的原因是因为JAVA程序员为保证JDK1.4代码的可读性,JDK1.5有一个规范“参数化类型与原始类型相兼容”
我们只看这三句:GenericShow gs = new GenericShow (); 表明gs是原始类型;
static void fun(GenericShow <? extends Number> c){...}:将泛型类型GenericShow<D>定义为具体的参数化类型GenericShow<? extends Number>
fun(gs); 类似于GenericShow <? extends Number> c=gs,即原始化类型指向参数化类型,gs就能顺利传值给c.

具体的<? extends Number>只是一个实际类型参数,用作具体类型限定GenericShow,与要传入的类型是不是Number及其子类无关
作者: 贾存双    时间: 2012-7-16 05:07
本帖最后由 贾存双 于 2012-7-16 05:08 编辑

形参c只是引用了实参b的地址,并不是赋值啊!
作者: 许瑞航老师    时间: 2012-7-16 17:40
许瑞航 发表于 2012-7-14 21:50
泛型不能这么写

我试了、、 确实会报错哇、、




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