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

标签 java generics compiler-construction

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

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 的项目中测试一些奇怪的东西。如何在保持逻辑完整的情况下完成这项工作?

谢谢

最佳答案

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

一个小测试用例:

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

您不能拥有包含任何接口(interface)的交集类型,该接口(interface)包含任何其签名与基类上的非公共(public)方法(在本例中为隐式对象)相匹配的方法。然而,这并不特定于对象或克隆:

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

public interface Interface {
    public void m();
}

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

Here's the relevant Oracle bug ,标记为“不是缺陷”。

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

关于java - 继承方法Object.clone()无法隐藏公共(public)抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6837362/

相关文章:

javascript - 有哪些学习如何实现方案宏的好资源?

Java 对象.等于

java - Hibernate需要很长时间才能得到查询结果

typescript - Typescript 中异构函数的映射

generics - Groovy - 将 DefaultGroovyMethods 方法委托(delegate)给通用对象

c++ - 与 gcc 相比,comeau 编译器值得吗?

java - 使用反射打印列表

java - JDBC准备好的语句/引用另一个准备好的语句中的准备好的语句

c++ - 从函数返回通用类型数据

python - numba 编译逻辑比较中的性能损失