带有接口类和类型变量的Java交集类型的限制

今天我尝试用一​​个使用交集类型的generics方法编写一个类,并根据相交的类型对不同的错误消息感到困惑。 假设我们有一个interface和一个class并在通用接口中定义generics方法:

 class ClassType { } interface InterfaceType { } interface I { public  void foo(); public  void foo1(); public  void foo2(); public  void foo3(); public  void foo4(); public  void foo5(); public  void foo6(); public  void foo7(); } 

编译这会产生所有方法的错误,除了public void foo2();

 Main.java:8: error: repeated interface public  void foo(); ^ Main.java:10: error: interface expected here public  void foo1(); ^ Main.java:14: error: interface expected here public  void foo3(); ^ Main.java:16: error: a type variable may not be followed by other bounds public  void foo4(); ^ Main.java:18: error: unexpected type public  void foo5(); ^ required: class found: type parameter T where T is a type-variable: T extends Object declared in interface I Main.java:20: error: unexpected type public  void foo6(); ^ required: class found: type parameter T where T is a type-variable: T extends Object declared in interface I Main.java:22: error: a type variable may not be followed by other bounds public  void foo7(); ^ 7 errors 

由于交叉应该是对称的,我很惊讶foo2被接受但foo3被拒绝了。 为什么接受这一案件?

我也想知道为什么在交集类型方面为什么接口,类和类型参数之间存在区别。 我可以看到在交集类型中不允许多个类的原因,但接受ClassType & InterfaceType但不接受InterfaceType & ClassType的当前状态似乎是奇怪的任意。 交叉点A & A也被禁止,但这在语义上与A相同,所以我没有看到这个的原因。

我也很好奇为什么交叉路口不允许使用类型变量。 最坏的情况是两个或更多类的交集,但只是一个无人居住的类型,所以底部类型。

您只能拥有1个类但具有多个接口。 如果你有一个类,它必须是指定的第一个类。 如果您遵循此规则,则不应出现任何编译错误。

请参阅https://docs.oracle.com/javase/tutorial/java/generics/bounded.html