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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© zhou_411424 黑马帝   /  2011-11-22 19:56  /  1727 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 zhou_411424 于 2011-11-28 14:28 编辑

1.通配符“?”的应用能详细说明下吗?
以及<? extends T>和<? super T>的应用

4 个回复

倒序浏览
<? extends T>和<? super T>含有JAVA5.0的新的概念。由于它们的外表导致了很多人误解了它们的用途:
1.<? extends T>首先你很容易误解它为继承于T的所有类的集合,这是大错特错的,相信你一定见过或用过List<? extends T>吧?为什么我说理解成一个集合是错呢?
如果理解成一个集合那为什么不用List<T>来表示?所以<? extends T>不是一个集合,而是T的某一种子类的意思,记住是一种,单一的一种,问题来了,由于连哪一种都不确定,带来了不确定性,所以是不可能通过 add()来加入元素。
你或许还觉得为什么add(T)不行?因为<? extends T>是T的某种子类,能放入子类的容器不一定放入超类,也就是没可能放入T。
2.<? super T>这里比较容易使用,没<? extends T>这么多限制,这里的意思是,以T类为下限的某种类,简单地说就是T类的超类。
但为什么add(T)可以呢?
因为能放入某一类的容器一定可以放入其子类,多态的概念。
回复 使用道具 举报
“?”表示不确定是什么类,<? extends T>表示T类或这个类的某个子类    <? super T> 表示T类或这个类的夫类
  
回复 使用道具 举报
1.固定的泛型类型系统使用起来并没有那么令人愉快。Java的设计者发明了一种巧妙(仍然是安全的)“解决方案”:通配符类型。
例如:Pair<? extends B>,表示任何泛型Pair类型,它的类型参数是B的子类,如Pair<BSub>,但不是Pair<Date>。
构造一个方法:
    public static void executeFun(Pair<BSub> p){
        p.getFirst().fun();
        p.getSecond().fun();
    }
不能将Pair<B>传给这个方法,方法的功能受到了很大的限制。解决方法是:使用通配符类型。
    public static void executeFun(Pair<? extends B> p){
        ...
    }
类型Pair<BSub>是Pair<? extends B>的子类型。

2.<? extends T>表示所有T的子类都可以当成参数传递,<? super T>表示s所有 T 以及T的父类都能够当做参数传递
回复 使用道具 举报
楼上正解。下面是一个应用
public abstract class Shape{
             public abstract void draw(Canvas c);
}
public class Circle extend Shape{
               public void draw(Canvas c){
}
}
public class Canvas{
      public void drawAll(List<? extends Shape>){
                      for(Shape s : shapes){
                                  s.draw(this);
}
}
public static void main(String[] args){
          List<Circle> circleList = new ArrayList<Circle>;
          circleList.add(new Circle);
          Canvas c = new Canvas;
          c.drawAll(circleList); }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马