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

Arc*_*hie 6 java javac

接口:

interface PublicCloneable {
    Object clone();
}

interface HasPosition {
    // doesn't matter
}
Run Code Online (Sandbox Code Playgroud)

尝试使用交集类型:

@SuppressWarnings("unchecked")
<E extends PublicCloneable & HasPosition> E cloneAndIncrementPosition(E elem) {
    final E clone = (E)elem.clone();
    // rest omitted
}
Run Code Online (Sandbox Code Playgroud)

尝试编译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
Run Code Online (Sandbox Code Playgroud)

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

Zho*_*gYu 8

这看起来像一个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引入一个名义界面,扩展它们,这应该没问题.