继承的方法Object.clone()无法隐藏公共抽象方法

dev*_*ium 13 java compiler-construction generics

所以,我有一些狂野的,疯狂的代码,这使得编译器在我的脸上吐了几个小时以下错误:

The inherited method Object.clone() cannot hide the public abstract method in IOrderable<T>
Run Code Online (Sandbox Code Playgroud)

罪魁祸首类如下(错误出现在通用的T中):

public class MyInterval<T extends Xpto & Successorable<T>> implements Cloneable {
    public MyInterval<T> clone(){
        MyInterval<T> it = null;
        try {
            it = (MyInterval<T>) super.clone();
            it.max = it.max.clone();
            it.min = (T) it.min.clone();
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return it;
    }
}

public interface Xpto {}

public interface Successorable<Y> extends IOrderable<Y> {
    Y suc();    
}   

interface IOrderable<J> extends Rankable<J>, Cloneable {
    boolean greaterEq(J e);
    J clone();
}

public interface Rankable<P> {
    int rank(P e);
}
Run Code Online (Sandbox Code Playgroud)

是的,他们似乎有点随意.它们仅用于在我正在进行的编译器/ java_byte_code_instrumentation类项目中测试一些奇怪的东西.如何在保持逻辑完整的同时完成这项工作?

谢谢

par*_*uat 7

我遇到了相同的编译错误,据我所知,这是交集类型(多重绑定泛型类型)规范中的边缘情况,并且没有可能的解决方案.

一个小测试用例:

public interface InterfaceA {
    public Object clone();
}

public interface InterfaceB {}

public class ClassA<T extends InterfaceA> {} // ok

public class ClassB<T extends InterfaceA & InterfaceB> {} //not ok
Run Code Online (Sandbox Code Playgroud)

您不能拥有包含任何接口的交集类型,该接口包含其签名与基类上的非公共方法匹配的任何方法(在本例中为隐式Object).这不是特定于Object或clone,但是:

public abstract class Base {
    protected abstract void m();
}

public interface Interface {
    public void m();
}

public class Class<T extends Base & Interface> {} // not ok
Run Code Online (Sandbox Code Playgroud)

这是相关的Oracle错误,标记为"非缺陷".

这是相关的Eclipse错误,其中修改了编译器以产生与javac匹配的相同错误.这似乎是Indigo 3.7的一个变化,这解释了为什么有些人可以复制而其他人无法复制.