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

2022-09-04 22:15:48

所以,我有一点疯狂的代码,它使编译器在我面前吐了几个小时以下错误:

The inherited method Object.clone() cannot hide the public abstract method in IOrderable<T>

罪魁祸首类如下(错误出现在泛型的 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);
}

是的,它们看起来有点随机。它们的存在只是为了在我正在做的编译器/类似java_byte_code_instrumentation的项目中测试一些奇怪的东西。如何在保持逻辑不变的同时完成这项工作?

谢谢


答案 1

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

一个小测试用例:

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

不能有一个交集类型包含任何接口,这些接口包含其签名与基类(在本例中为 Object)上的非公共方法匹配的任何方法。但是,这并不特定于对象或克隆:

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

public interface Interface {
    public void m();
}

public class Class<T extends Base & Interface> {} // not ok

下面是相关的 Oracle 错误,标记为“不是缺陷”。

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


答案 2

我认为本教程解释了这个问题,你应该能够找出一个解决方案。问题是当类型参数具有多个边界时。

下面的代码复制了该错误。

interface Xpto
{
}

interface Xable < T >
{
    T clone ( ) ;
}

class MyStuff < S extends Xpto & Xable < S > >
{
}

但是,下面的代码基本相同,但没有编译器错误。

interface Xpto
{
}

interface Xable < T > extends Xpto
{
    T clone ( ) ;
}

class MyStuff < S extends Xable < S > >
{
}

推荐