为什么在Java中不可能使用二级泛型

Cod*_*der 8 java generics

长话短说: 为什么Java中不可能有以下内容?

public class Test<A<B>> {} // A and B both being generic parameters.
Run Code Online (Sandbox Code Playgroud)

注意:我现在没有任何特定用例,而只是想了解为什么不允许这样做.

起初我以为因为编译器不能断言是否A可以接受泛型参数,因为在编译之后A,由于类型擦除,泛型将不再存在.

但是,如果是这种情况,那么我们根本不能在任何类上使用泛型.所以我拿出了泛型类的字节代码,发现有元数据表示它接受泛型.

public class com.Test<T> {
  public com.Test();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return
}
Run Code Online (Sandbox Code Playgroud)

我做了一个快速搜索,SO确认已编译的代码也将具有泛型相关的元数据

那么为什么编译器不允许多级泛型?

允许它会有任何问题吗?这是一个限制吗?或者是其他东西?

Kon*_*kov 7

让我们假设这个类实际编制:

public class Test<A<B>> { .. }
Run Code Online (Sandbox Code Playgroud)

这意味着类的正确实例化将是:

new Test<Class<Integer>>()
//or
new Test<List<String>>()
Run Code Online (Sandbox Code Playgroud)

并且以下内容不正确(因为提供的type-parameter不是通用的):

new Test<String>();
//or
new Test<Object>();
Run Code Online (Sandbox Code Playgroud)

然而,类型参数不应该被限制为是一般或不-它应该只是保存有关的一些元信息类型(而事实证明,这是类型后类型擦除已经发生),与它会更换.

类型擦除本身可能是不允许这种结构的另一个可能原因.让我们再次考虑上面的Test类已正确定义,你有这个:

new Test<Class<Integer>>();
Run Code Online (Sandbox Code Playgroud)

当类型擦除发生时,<A<B>>应该替换为Class<Integer>,但是,由于擦除,我们只有一个Class(即使在内部它将包含有关Integer类型的信息) - 期望a Class<Integer>,但提供一个Class不应该是正确的.

感谢有趣的问题!