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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 李伟 中级黑马   /  2012-6-21 22:12  /  1885 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 李伟 于 2012-6-22 12:15 编辑

? extends T和? super T到底什么区别,感觉不太好理解,明白的请举例说明一下,谢谢

7 个回复

倒序浏览
本帖最后由 淡然 于 2012-6-21 22:36 编辑

泛型限定
例:Student extends Person
ArrayList<Person> al =new ArrayList<Student>(); //错误,左右两边必须一致。左右两边不一致时易出安全问题。这时可以使用泛型限定
ArrayList<?extends Person> //只允许Person和它的子类,上限。如Collection类addAll(Collection<? extends E> c)
ArrayList<?super Student > //只允许Student和它的父类,下限。如TreeSet类TreeSet(Comparator<? super E> comparator)
  1. package hcy.test.main;

  2. import java.util.ArrayList;

  3. class Person{

  4. }

  5. class Student extends Person{

  6. }

  7. class Worker extends Person{

  8. }

  9. class Test
  10. {
  11. public static void main(String[] args)
  12. {
  13. Test t=new Test();
  14. ArrayList<Person> al1=new ArrayList<Person>();
  15. al1.add(new Person());
  16. al1.add(new Person());

  17. ArrayList<Student> al2=new ArrayList<Student>();
  18. al2.add(new Student());
  19. al2.add(new Student());

  20. ArrayList<Worker> al3=new ArrayList<Worker>();
  21. al3.add(new Worker());
  22. al3.add(new Worker());

  23. t.printFather(al1);
  24. t.printFather(al2);
  25. t.printFather(al3);//编译通不过,只允许Student和它的父类

  26. t.printSon(al1);
  27. t.printSon(al2);
  28. t.printSon(al3);

  29. }

  30. public void printSon(ArrayList<? extends Person> al){
  31. System.out.println("right!");
  32. }

  33. public void printFather(ArrayList<? super Student> al){
  34. System.out.println("right!");
  35. }
  36. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
关于? extends T和? super T到底什么区别,你对比一下自然就清楚了,?代表你要填进去的内容:
? extends T:代表的即是继承于T的那个类,因而表示的是里面可以放T和T的子类;
? super T:代表的是T的超类,因而表示里面可以放T和T的父类!
回复 使用道具 举报
举一个家族成员例子吧

?extends T :

T代表这个家族的始祖,那么?extends T就是说?只要是T的后代就行,即T的子子孙孙了,它是有上限的

?super T:
T代表这个家族的最小一代,那么?super T就是说?只要是T的前辈就行,即T的爷爷爸爸等,它是有下限的

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
建议你把Java中的继承梳理清除,这些概念是很容易理解的
? extends T指的是可以支持T和T的子类;
? super T值得是可以支持T和T的父类
回复 使用道具 举报
1. <? super T>  表示以T类型为下限的某种类
实例化的时候对象的泛型一定要大于等于T类型(也就是T的父类或自己)
使用的时候类型一定要小雨等于T类型(也就是T的子类或自己)

2. <? extends T> 表示以T类型为上线的某种类
实例化的时候对象的泛型一定要小于等于T类型(也就是T的子类或自己)



import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Searching {
    public static void main(String[] args) {
        String[] strings = { "0", "1", "2", "3", "4", "5"};

        List<Integer> integers = new ArrayList<Integer>();
        for(String s : strings){
            integers.add(Integer.valueOf(s));
        }
        if(integers.get(1)>new Integer(1)){System.out.println("<1>");}
        if(integers.get(1)<new Integer(1)){System.out.println("<2>");}
        if(integers.get(1)==new Integer(1)){System.out.println("<3>");}
        System.out.println(Collections.binarySearch(integers, 1,cmp));
    }

    static Comparator<Integer> cmp = new Comparator<Integer>(){
        public int compare(Integer i,Integer j){
            return i<j?-1:(i==j?0:1);
        }
    };
}
此程序输出:-2

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Searching {
    public static void main(String[] args) {
        String[] strings = { "0", "1", "2", "3", "4", "5"};

        List<Integer> integers = new ArrayList<Integer>();
        for(String s : strings){
            integers.add(Integer.valueOf(s));
        }
        if(integers.get(1)>new Integer(1)){System.out.println("<1>");}
        if(integers.get(1)<new Integer(1)){System.out.println("<2>");}
        if(integers.get(1)==new Integer(1)){System.out.println("<3>");}
        System.out.println(Collections.binarySearch(integers, 1,cmp));
    }

    static Comparator<Integer> cmp = new Comparator<Integer>(){
        public int compare(Integer i,Integer j){
            return i<j?-1:(i>j?1:0);
        }
    };
}
此程序输出:1
回复 使用道具 举报
韦念欣 黑马帝 2012-6-22 01:42:13
7#
泛型的限定我是这样理解的;
? extends T: 可以接收T类型或者T的子类型。限定上限。即T和T的后代都可以接收,其他不行
? super T: 可以接收T类型或者T的父类型。限定下限。即T和T的祖祖辈辈都可以接收,其他不行
回复 使用道具 举报
? extends T:    ?<T
? super T:        ?>T
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马