【问题标题】:What's wrong with passing generics map传递泛型映射有什么问题
【发布时间】:2017-07-10 21:35:40
【问题描述】:

我已经在 Car 类的构造函数中调用了:

public Car(Map<String, ? extends List<? extends WingMirror>> wingMirrorMap) {
    doSomething(wingMirrorMap); // Here i have error
}

private static <L extends List<M>, M extends WingMirror<T>, T> Map<String, L> doSomething (Map<String, L> wingMirrorMap) {
    // Do something with wingMirrorMap
}

通过传递参数wingMirrorMap,我遵循了错误:

The method doSomething(Map&lt;String,L&gt;) in the type Car is not applicable for the arguments (Map&lt;String,capture#2-of ? extends List&lt;? extends WingMirror&gt;&gt;)

为什么它不起作用。我看不出方法调用有什么问题。

【问题讨论】:

  • Color什么时候变成参数化类型了?
  • 这里是颜色类的定义public class Color&lt;T&gt; extends SuperColor&lt;T&gt; {}
  • 啊,那不是java.awt.Color。您的部分问题可能是一个 Color 已参数化,而另一个未参数化。
  • 不要将你的类型命名为众所周知的java.*类型。
  • 现在 cmets 造成混乱,改回颜色!

标签: java generics collections


【解决方案1】:

你的问题是 List&lt;? extends WingMirror&gt; 声明。

您的doSomething 方法被声明为仅采用WingMirror 的一种子类型,方法是在其签名中包含M extends WingMirror&lt;T&gt;。但是汽车构造函数正在尝试传递允许具有不同WingMirror 子类型的列表。

例如,如果您有WingMirror 的两个子类型SubWingMirror1SubWingMirror2doSomething 只会接受只有SubWingMirror1SubWingMirror2 但不能同时包含两者的列表。但是List&lt;? extends WingMirror&gt; 可以混合使用任何一种子类型。

【讨论】:

    猜你喜欢
    • 2011-04-16
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-06
    • 2012-12-28
    相关资源
    最近更新 更多