当名义类需要访问修改时,无法使用交集类型
接口:
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()
方法签名的类型。