长话短说: 为什么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确认已编译的代码也将具有泛型相关的元数据
那么为什么编译器不允许多级泛型?
允许它会有任何问题吗?这是一个限制吗?或者是其他东西?
让我们假设这个类是实际编制:
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
不应该是正确的.
感谢有趣的问题!