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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 苏小惠 中级黑马   /  2014-1-21 20:56  /  1427 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 苏小惠 于 2014-2-24 18:58 编辑

泛型有两种限定方式:分为上限限定:?extends T   和 下限限定:? super T  请问具体什么情况要用哪个限定,请详细点

评分

参与人数 1技术分 +1 收起 理由
黄晓鑫 + 1

查看全部评分

3 个回复

倒序浏览
当要对存储元素的对象限定为本类和父类 就可以用 ?super T 当对存储元素的对象限定为父类或者继承父类的子类进行限定时 就用 ?extends T
回复 使用道具 举报 1 0
.<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信能看下去你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过 add()来加入元素。你或许还觉得为什么add(T)不行?因为<? extends T>是T的某种子类,能放入子类的容器不一定放入超类,也就是没可能放入T。
回复 使用道具 举报
上限  ? extends E :可以接受E类型或者E的子类型 。用extends关键字声明,表示参数化的类型可能是所指定的类型,或者是此类型的子类。
下限   ? super E   :可以接受E类型或者E的父类型。用super进行声明,表示参数化的类型可能是所指定的类型,或者是此类型的父类型,直至Object。
举例说明
class Point<T>{
        private T x;
        private T y;
        public T getX(){
                return x;
        }
        public void setX(T x){
                this.x = x;
        }
        public T getY(){
                return y;
        }
        public void setY(T y){
                this.y = y;
        }
}
public class  generic{
        /*
        static void show(Point<? extends Number> p){//调用show(p2)无法通过方法调用转换将实际参数Point<String>转换为Point<? extends Number>        
                System.out.println(p.getX());
                System.out.println(p.getY());
        }
        */
        public static void show(Point<? super String> p){//调用show(p1) 无法通过方法调用转换将实际参数Point<Integer>转换为Point<? super String>
                System.out.println(p.getX());
                System.out.println(p.getY());
        }

        public static void main(String[] args) {
                Point<Integer> p1 = new Point<Integer>();
                p1.setX(1);
                p1.setY(2);
                Point<String> p2 = new Point<String>();
                p2.setX("3");
                p2.setY("4");
                //show(p1);
                show(p2);
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马