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

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

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

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

 public class MyInterval<T extends Xpto & Successorable> implements Cloneable { public MyInterval clone(){ MyInterval it = null; try { it = (MyInterval) 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 extends IOrderable { Y suc(); } interface IOrderable extends Rankable, Cloneable { boolean greaterEq(J e); J clone(); } public interface Rankable

{ int rank(P e); }

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

谢谢

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

一个小测试用例:

 public interface InterfaceA { public Object clone(); } public interface InterfaceB {} public class ClassA {} // ok public class ClassB {} //not ok 

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

 public abstract class Base { protected abstract void m(); } public interface Interface { public void m(); } public class Class {} // not ok 

这是相关的Oracle错误 ,标记为“非缺陷”。

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

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

以下代码复制错误。

 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 > > { } 

我解决了将clone实现为public的问题

我也得到了这个错误,但是我觉得我有点不同……

下面的代码工作正常:(它嵌套在另一个类中,因此接口不需要公共方法)。

 interface A{} class B{ class C extends B implements A{ } } 

将非公共方法添加到接口A并在B类中非公开地实现时会发生此问题。

 interface A{ void doeet(); } class B{ void doeet(){}; class C extends B implements A{ } } 

看看你的代码,似乎是相似的,因为接口中的一些方法尚未被声明为public。

我有同样的错误。

在我的情况下,我忘记了一个方法前面的public关键字,该方法必须实现为包含它的类实现了一个定义它的接口。