黑马程序员技术交流社区

标题: 被泛型搞晕了 [打印本页]

作者: zhou_411424    时间: 2011-11-22 19:56
标题: 被泛型搞晕了
本帖最后由 zhou_411424 于 2011-11-28 14:28 编辑

1.通配符“?”的应用能详细说明下吗?
以及<? extends T>和<? super T>的应用
作者: 袁世宇    时间: 2011-11-22 21:03
<? 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)可以呢?
因为能放入某一类的容器一定可以放入其子类,多态的概念。

作者: 常文艺    时间: 2011-11-22 21:29
“?”表示不确定是什么类,<? extends T>表示T类或这个类的某个子类    <? super T> 表示T类或这个类的夫类
  
作者: 程立彬    时间: 2011-11-22 21:51
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的父类都能够当做参数传递
作者: 肖岑锋    时间: 2011-11-22 21:53
楼上正解。下面是一个应用
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); }
}




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