以下Java接口在Oracle jdk1.6.0_31和Eclipse 3.7.2中编译,但不在jdk1.7.0_03中编译:
public interface Foo<
A extends Foo<A, B>,
B extends Foo<B, ?>
> {}
(仅在明确时尝试换行)
我尝试编译:
[mth@lim tmp]$ /usr/java/jdk1.6.0_31-i586/bin/javac Foo.java
[mth@lim tmp]$ /usr/java/jdk1.7.0_03-i586/bin/javac Foo.java
Foo.java:3: error: type argument B is not within bounds of type-variable A
B extends Foo<B, ?>
^
where B,A are type-variables:
B extends Foo<B,?> declared in interface Foo
A extends Foo<A,B> declared in interface Foo
1 error
这是故意改变行为还是错误?
为了提供一些上下文,在我的代码中实现它的类是例如FirstFoo<FirstFoo, SecondFoo>
SecondFoo
SecondFoo<SecondFoo, ThirdFoo>
FinalFoo<FinalFoo, FinalFoo>
。在某些时候,链条会以{{1}}停止。因此,每个实现都有自己的类型作为第一个类型参数(类似于枚举)和第二个相关类型。