Java 为什么方法参数和通配符不';不能互换工作吗?

Java 为什么方法参数和通配符不';不能互换工作吗?,java,generics,Java,Generics,我认为参数和通配符占位符的含义大致相同,第一个用于定义类和方法,第二个用于声明变量。但显然情况并非如此 import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { Consumer<List<? extends Number>> l1 = null;

我认为参数和通配符占位符的含义大致相同,第一个用于定义类和方法,第二个用于声明变量。但显然情况并非如此

import java.util.List;
import java.util.function.Consumer;

public class Main {

    public static void main(String[] args) {
        Consumer<List<? extends Number>> l1 = null;
        Consumer<List<? extends Number>> l2 = null;

        l1 = l2;    // compiles
    }

    static <T extends Number> void m(Consumer<List<T>> l) {
        Consumer<List<? extends Number>> l3 = l; // doesn't compile
    }
}
import java.util.List;
导入java.util.function.Consumer;
公共班机{
公共静态void main(字符串[]args){

消费者
Consumer
不是
的子类型消费者我会使用
Consumer l2
,虽然我不清楚这为什么不起作用。@PeterLawrey你是对的。这有效:
Consumer@ArtemPetrov这是一个笑话。@Bohemian one cast就足够了
consumer因为编译器不知道t是什么,但编译器知道does知道T必须是一个特定类型。T永远不能是通配符。
Consumer<? extends List<? extends Number>> l3 = l;
static void m(Consumer<? extends List<? extends Number>> l3)