【问题标题】:Does class B that implements interface I that extends interface J also extends type I?实现扩展接口 J 的接口 I 的类 B 是否也扩展类型 I?
【发布时间】:2013-09-25 16:46:43
【问题描述】:

代码让我感到困惑:

 Collection<? extends Map<String, String>> a = 
                       new ArrayList<SortedMap<String, String>>();
 SortedMap<String, String> b = new TreeMap<String, String>();
 b.put("1","a");

错误:

 a.add(b);

Collection 类型中的方法 add(capture#2-of ? extends Map) 不适用于参数 (SortedMap) 为什么? SortedMap 是 Map 的扩展类,TreeMap 是一个实现 SortedMap 的类。

【问题讨论】:

    标签: java class map interface implementation


    【解决方案1】:

    这意味着

     Collection<? extends Map<String, String>> a ;
    

    a 的元素是一个扩展 Map 的 unknown 类。你的意思是当你得到一个值时它是一个地图,但你不能说哪个地图可以有效地添加到集合中。

    例如,a 不知道扩展 Map 的类,因此它不能允许任何子类,因为它不知道哪个是有效的。

    List<HashMap<String, String>> listOfMap = new ArrayList<>();
    Collection<? extends Map<String, String>> a = listOfMap;
    SortedMap<String, String> b = new TreeMap<String, String>();
    b.put("1", "a");
    a.add(b); // produces an error  as it should.
    

    如果您将a 更改为

    Collection<SortedMap<String, String>> a = new ArrayList<SortedMap<String, String>>();
    

    b 是这种类型,可以添加。

    【讨论】:

    • 为什么我不能说?扩展 Map 的每种类型都是有效的。
    • @user710818 这不是? extends 的意思。它意味着任何子类都是有效的,它意味着子类是未知的。看我的例子。
    • 明白。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多