Java 复杂类型中的泛型通配符边框

Java 复杂类型中的泛型通配符边框,java,generics,Java,Generics,我不明白你的意思。 您能解释一下为什么在下面的示例中,processList工作得很好,而processMap由于编译错误而失败吗?我应该如何更改processMap的签名,使其既能与Map一起工作,又能与Map public void processList(List如果您消除了通配符,就可以使它工作。例如,您创建了一个具有命名类型的泛型函数: public void进程映射(映射映射){ } public void processList(ListMap半个答案:下面的代码确实为我编译 缺失

我不明白你的意思。
您能解释一下为什么在下面的示例中,
processList
工作得很好,而
processMap
由于编译错误而失败吗?我应该如何更改
processMap
的签名,使其既能与
Map
一起工作,又能与
Map


public void processList(List如果您消除了通配符,就可以使它工作。例如,您创建了一个具有命名类型的泛型函数:

public void进程映射(映射映射){
}

public void processList(List
Map半个答案:下面的代码确实为我编译

缺失:一个很好的解释为什么命名的T有效;但是一个未命名的?无效

public <T> void processMap(Map<String, List<T>> map) {
}

public void f() {
    Map<String, List<String>> map = new HashMap<>();
    processMap(map);
    Map<String, List<Object>> map2 = new HashMap<>();
    processMap(map2);
}
public void进程映射(映射映射){
}
公共空间f(){
Map Map=newhashmap();
流程图(map);
Map map2=新的HashMap();
processMap(map2);
}

我认为这之所以有效与此有关。只是发布了相同的…唯一的区别是:没有必要将
扩展对象
放在那里。您将使用的任何T都将在不告诉编译器的情况下扩展对象;-)是的。现在可以使用
了。
扩展
对于
之类的东西很有用,我不知道我是否正确,但java编译器似乎无法解析或转换用作映射问题中定义的集合的键的集合类型。我这样说是因为当我将函数签名修改为
公共静态无效进程映射(映射
public void processMap(Map<String, List<? extends Object>> map)
public <T extends Object> void processMap(Map<String, List<T>> map)
public <T extends Object> void processMap(Map<String, List<T>> map) {
}

public void processList(List<? extends Object> list) {
}

public void f() {
    List<String> list = new ArrayList<>();
    Map<String, List<String>> map = new HashMap<>();

    processList(list); // OK
    processMap(map); // OK now
    processMap(new HashMap<String, List<Integer>>()); // this is OK too
}
Map<String, List<? extends Object>> map = new HashMap<>();
public <T> void processMap(Map<String, List<T>> map) {
}

public void f() {
    Map<String, List<String>> map = new HashMap<>();
    processMap(map);
    Map<String, List<Object>> map2 = new HashMap<>();
    processMap(map2);
}