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

时间:2015-10-08 18:27:46

标签: java javac

接口:

interface PublicCloneable {
    Object clone();
}

interface HasPosition {
    // doesn't matter
}

尝试使用交叉点类型:

@SuppressWarnings("unchecked")
<E extends PublicCloneable & HasPosition> 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 extends PublicCloneable & HasPosition> 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无效?

2 个答案:

答案 0 :(得分:8)

这看起来像是一个javac bug。

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

  

带有绑定T&amp;的类型变量X的成员I1&amp; ......&amp; In是交叉类型的成员(§4.9)T&amp; I1&amp; ......&amp;在

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

  

每个交叉路口类型T1&amp; ......&amp;为了识别交叉点类型的成员,Tn引入了一个名义类或接口......

     

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

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

答案 1 :(得分:0)

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