在下面这个例子中,通配符用于向API的用户隐藏类型信息。在内部,Set被存储为CustomerImpl。而API的用户只知道他们正在获取一个Set,从中可以读取Customer。 
此处通配符是必需的,因为无法从Set<CustomerImpl>向Set<Customer>赋值: 
public class CustomerFactory {
    private Set<CustomerImpl> _customers;
    public Set<? extends Customer> getCustomers() {
        return _customers;
    }
}
****************************************************上面的材料,无论从文字或从代码,我都无法理解,有哪位高手能解释一下它想表达的意思?谢谢

解决方案 »

  1.   

    Set<? extends Customer>这样的一个数据结构是指一个Set,这个里面Set存放的元素可以是任意继承或实现Customer的对象。根据上述代码Customer是个基类或接口,而CustomerImpl是Customer的子类或实现,上述代码的意义在于,用户只知道返回的是元素为Customer的Set,但是具体是什么内部实现,比如是CustomerImpl还是CustomerImpl2用户并不关心,说到底这是引入generic的一种多态性的体现。这也是一种工厂模式!
      

  2.   

    有两个问题1 假设Customer是父类,那么  private Set<CustomerImpl> _customers;
    写成 private Customer _customers;也可以呀,写成Set的形式有何好处?
    2  我发现1.5中,一个类可以继承一个接口的,这是什么回事呢?在新的语法中,继承接口跟实现接口有区别吗?
      

  3.   

    1问题只是举个例子
    可能在别的collections可以啊
    泛型只是提供一种通用的解决方法
      

  4.   

    搂主的代码我编译过,我把Customer设成接口也是不报错的,但如果是
    class CustomerImpl extends Customer{}这样就报错了