带有接口类和类型变量的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