接口:
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无效?
答案 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()
方法的两个不兼容签名的类型。