Java 为什么可以';不能将嵌套通配符分配给具有类型参数的变量吗?

Java 为什么可以';不能将嵌套通配符分配给具有类型参数的变量吗?,java,generics,Java,Generics,考虑这个例子: static class Generic<E> {} static void run() { Generic<?> x = null; take(x); } static <E> void take(final Generic<E> x) {} 在本例中,通配符仍然表示一些未知类型T,并且E参数可以指定任何类型。为什么编译器不推断T可以分配给E,并允许编译此代码?这段代码没有编译有什么原则上的原因吗 注意:将第

考虑这个例子:

static class Generic<E> {}

static void run() {
    Generic<?> x = null;
    take(x);
}

static <E> void take(final Generic<E> x) {}
在本例中,通配符仍然表示一些未知类型
T
,并且
E
参数可以指定任何类型。为什么编译器不推断
T
可以分配给
E
,并允许编译此代码?这段代码没有编译有什么原则上的原因吗

注意:将第二个示例中的
take
方法更改为以下编译:

static <E> void take(final Generic<Generic<? extends E>> x) {}
static void take(final Generic
Generic>
。类型为
Generic>
的对象,这将是一个列表,可以将
list
list
list
等作为元素。没有类型
T
可以这样做


直观地说,第一个代码段为一些未知的
T
调用
take
,而第二个代码段则需要使用
作为类型参数专门调用
take
,这是被禁止的。具体地说,我认为Java为
泛型
中的
为fi生成了一个新的类型变量rst代码段,第二个代码段中的嵌套通配符不会出现这种情况。不过,我还没有完全弄清楚类型推断是如何进行的。

我不确定,但我认为它也是针对Liskov原则的。泛型类型是指在类型上参数化的泛型类或接口。Liskov替换原则确实如此无法使用参数化类型。 例如,如果您编写以下命令,则会出现编译时错误:

List<Numbers> list = new ArrayList<Integers>();
List List=new ArrayList();

这同样适用于通配符:当使用
Generic
计算
Generic
时,它没有子类型关系。这就是为什么它会给出编译时错误,因为它不能从中推断出任何东西。E.

有一个小注释:既然泛型是不变的,你应该使用
@Turing85我同意真实代码,但我要问一个问题关于此特定代码。将第二个示例中的
参数的类型更改为
generic这就是我将其作为备注编写的原因;)实际上,为了真正遵守PECS,您应该编写
generic related:清晰简洁。谢谢。我想问题的核心是为什么
Generic
Generic
没有子类型关系,因为后者可以分配给前者。
List<Numbers> list = new ArrayList<Integers>();