当名义类需要访问修改时,无法使用交集类型

接口:

interface PublicCloneable { Object clone(); } interface HasPosition { // doesn't matter } 

尝试使用交集类型:

 @SuppressWarnings("unchecked")  E cloneAndIncrementPosition(E elem) { final E clone = (E)elem.clone(); // rest omitted } 

尝试使用javac 1.8.0_60进行编译:

 $ javac xx.java xx.java:13: error: clone() in Object cannot implement clone() in PublicCloneable  E cloneAndIncrementPosition(E elem) { ^ attempting to assign weaker access privileges; was public xx.java:14: error: clone() has protected access in Object final E clone = (E)elem.clone(); ^ 2 errors 

为什么这个交集类型对javac无效?

这看起来像一个javac bug。

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.4

具有绑定T&I1&…&In的类型变量X的成员是交集类型的成员(§4.9)T&I1&…&In

http://docs.oracle.com/javase/specs/jls/se8/html/jls-4.html#jls-4.9

每个交叉点类型T1&…&Tn引入一个名义类或接口,用于识别交叉点类型的成员……

如果Ck是Object,则会产生一个名义界面…具有直接超接口T1’,…,Tn’

因此,对于PublicCloneable & HasPosition ,引入了一个名义界面,扩展了它们,这应该没问题。

由于第一个错误是试图告诉您,您的代码无法工作,因为您正在限制具有两个不兼容的clone()方法签名的类型。