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