【问题标题】:Java nested wildcard generic won't compileJava 嵌套通配符泛型无法编译
【发布时间】:2010-08-04 13:15:42
【问题描述】:

我对 Java 泛型中的有界嵌套通配符有疑问。

这是一个常见的情况:

public void doSomething(Set<? extends Number> set) {}

public void callDoSomething() {
    Set<Integer> set = new HashSet<Integer>();
    doSomething(set);
}

这是标准的 Java 泛型,工作正常。

但是,如果通配符嵌套,它将不再起作用:

public void doSomething(Map<String, Set<? extends Number>> map) {}

public void callDoSomething() {
    Map<String, Set<Integer>> map = new HashMap<String, Set<Integer>>();
    doSomething(map);
}

这会导致编译器错误。

我尝试了各种类型的强制转换和通配符排列,但无法正常工作。我不记得以前见过这个问题,而且我已经使用仿制药多年了。我是不是太累了,错过了什么明显的东西?

【问题讨论】:

标签: java generics nested wildcard


【解决方案1】:

所以问题是,doSomething 可以实现为:

public void doSomething(Map<String, Set<? extends Number>> map) {
    Set<Float> set = ...;
    map.put("xyz", set);
}

你需要确定你的实际意思。

大概是这样的:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}

【讨论】:

  • 是的,我只是独立地意识到了这一点。我可以发誓我昨天尝试过,但我可能还有其他一些细微的变化。
【解决方案2】:

这对你有用:

public void doSomething(Map<String, ? extends Set<? extends Number>> map) {}

【讨论】:

    【解决方案3】:

    要使代码正常工作,将 HashMap 创建为:

    Map<String, Set<? extents Number>> map = new HashMap<String, Set<? extents Number>>();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多