所以,我有一段疯狂的代码,这使得编译器在我脸上吐出以下错误几个小时:
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 的项目中的一些奇怪的事情。我怎样才能在保持逻辑完整的情况下完成这项工作?
我遇到了相同的编译错误,据我所知,这是交集类型(多重绑定泛型类型)规范中的边缘情况,并且没有可能的解决方案。
一个小测试用例:
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 bug,标记为“不是缺陷”。
这是相关的 Eclipse bug,其中编译器被修改以产生相同的错误以匹配 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 > >
{
}
我解决了这个问题,将克隆实现为公共
我也遇到了这个错误,但是我认为我的处理方式有点不同......
以下代码工作正常:(它嵌套在另一个类中,因此接口不需要具有公共方法)。
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 关键字,因为包含该方法的类实现了定义它的接口。