黑马程序员技术交流社区

标题: 继承中的泛型声明? [打印本页]

作者: t_mac    时间: 2011-12-9 14:25
标题: 继承中的泛型声明?
本帖最后由 t_mac 于 2011-12-13 14:11 编辑

如果父类直接在方法前声明了泛型的话子类应该如何指定具体类型呢?
也就是说如果我已经定义了一个类 即父类,在它的方法上声明了泛型(不是具体的),那么在子类方法中为什么不能指定具体的类型呢?
作者: 小春同学    时间: 2011-12-9 14:51
本帖最后由 hello西卡够 于 2011-12-9 14:52 编辑

在方法前加泛型,相当与指定了方法返回类型,而在子类中,你指明具体的类型,就相当于是另一个新的方法了,而这个方法却没有被定义过;此时,需要在父类中重载方法或子类中重写方法,且指定泛型。
作者: 周胜    时间: 2011-12-9 15:08
java中,方法的参数要求必须是“固定类型的”,加引号的原因就是对于泛型来说有点特殊,但是本质没有变化,即实例话对象之后,对象的方法所对应的参数必须是固定类型的。举一个例子:
boolean add(E e)  ,这个是ArrayList类的添加方法,这个参数表面看是可变的,但实际上也是有约定的。即Class ArrayList<E>,在实例话对象时需要指定泛型类型,否则E会默认是Object对象。所以要想方法类型动态指定就可以使用该形式。
作者: 刘海涛    时间: 2011-12-9 19:18
直接看代码:
  1. package com.itheima.bbs;

  2. /**
  3. * Person
  4. * @author Administrator
  5. *
  6. * @param <T>
  7. */
  8. public class Person<T> {
  9.         public T getObject() {
  10.                 return null;
  11.         }
  12. }



  13. package com.itheima.bbs;

  14. /**
  15. * Student 继承Person<String>
  16. * @author Administrator
  17. *
  18. */
  19. public class Student extends Person<String> {
  20.         @Override
  21.         public String getObject() {
  22.                 return "String";
  23.         }
  24. }


  25. package com.itheima.bbs;

  26. /**
  27. * Student 继承Person<Integer>
  28. * @author Administrator
  29. *
  30. */
  31. public class Teacher extends Person<Integer> {
  32.         @Override
  33.         public Integer getObject() {
  34.                 return 1;
  35.         }
  36.        
  37.         /**
  38.          * 测试
  39.          * @param args
  40.          */
  41.         public static void main(String[] args) {
  42.                 System.out.println(new Student().getObject().getClass()); //输出:class java.lang.String
  43.                 System.out.println(new Teacher().getObject().getClass()); //输出:class java.lang.Integer
  44.         }
  45. }
复制代码
其实就是在继承的时候申明泛型的类型就可以了。跟使用一个泛型的集合差不多。
如果需要了解更多,可以读下JDK原代码,里面好多都用到了泛型。




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