Javagenerics中类型参数的前向引用
根据Java Generics FAQ http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeParameters.html#FAQ302 ,类型参数不能以这种方式前向引用
// error
但是没关系
<A extends List, B> // ok
这两个示例使用最新的jdk 1.6.0_24
进行validation。
我的问题是,在语言规范中,这是指定的,隐含的还是可扣除的(即如果它是不真实的,其他事情可能会爆炸)。 我找不到任何地方。
更新
在javac7中,它是允许的。 直观地说,类型参数的顺序无关紧要; 类型系统要求类型变量之间没有循环依赖: 。 以前,这可以通过禁止前向参考来保证。 显然javac 7经过改进以放松排序,同时无论排序如何都能检测循环。
我不确定这是真的。 我查看了Java语言规范 ,在§6.3中讨论了类型参数的范围:
接口的类型参数的范围是接口的整个声明,包括类型参数部分本身 。 因此,类型参数可以显示为其自己边界的一部分,也可以显示为同一节中声明的其他类型参数的边界。
方法的类型参数的范围是方法的整个声明,包括类型参数部分本身 。 因此,类型参数可以显示为其自己边界的一部分,也可以显示为同一节中声明的其他类型参数的边界。
构造函数的类型参数的范围是构造函数的整个声明,包括类型参数部分本身 。 因此,类型参数可以显示为其自己边界的一部分,也可以显示为同一节中声明的其他类型参数的边界。
(我的重点)。
这表明在声明中
当写A extends B
时, B
确实在范围内。
此外,JLS的§4.4在引用类型变量的约束时说
绑定由类型变量或类或接口类型T组成
这表明不仅B
在 ,
范围内,而且它在
A
上是一个完全合法的界限。
最后,最重要的是,这段代码在javac
中javac
:
public class Test { public static A test(B obj) { return null; } }
因此,我非常确定这是完全合法的Java代码,并且您链接到的示例要么是错误的,要么是指其他内容。
希望这有帮助,如果我的推理存在缺陷,请告诉我!
这是完全合法的,更多的是,你可以想象A扩展C,这通常是扩展B.所以当C扩展B时你会怎么说?