简体   繁体   English

Java嵌套通配符泛型将无法编译

[英]Java nested wildcard generic won't compile

I have a problem with bounded nested wildcards in Java generics. 我在Java泛型中遇到了有界嵌套通配符的问题。

Here's a common case: 这是一个常见的案例:

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

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

This is standard Java generics, works fine. 这是标准的Java泛型,工作正常。

However if the wildcard becomes nested, it no longer works: 但是,如果通配符变为嵌套,则它不再起作用:

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

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

This leads to a compiler error. 这会导致编译器错误。

I've tried a variety of casts and wildcard permutations, but I'm unable to get this working. 我尝试了各种演员表和通配符排列,但我无法使其正常工作。 I don't recall seeing this issue before, and I've worked with generics for years. 我不记得以前看过这个问题了,多年来我一直在使用仿制药。 Am I just too tired and missing something obvious? 我是否太累了,错过了一些明显的东西?

So the problem is, doSomething could be implemented as: 所以问题是, doSomething可以实现为:

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

You need to decide what you actually mean. 你需要决定你的意思。

Probably something like: 可能是这样的:

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

这对你有用:

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

使代码工作创建HashMap为:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM