怎么纠正? – “都定义了getObjectCopy(),但是使用了不相关的返回类型” – 但它是* one *函数

我有以下界面heirarchy(所有不相关的function被剥离)。 我在尝试编译时收到此错误:

types ValidLineGettable and ValidateValue are incompatible; both define getObjectCopy(), but with unrelated return types

这一切都来自同一个函数 – 不是两个不同的函数具有相同的名称, 在同一个接口中具有相同的function 。 如何处理必须从两个不同的接口inheritance的接口,这两个接口本身必须从单个基接口inheritance?

我发现有两个关于具有相同名称的不同function的SO问题

  • 使用不相关的返回类型inheritance方法
  • Java – 接口实现中的方法名称冲突

就我而言,它在概念上和名义上都是相同的function。

(虽然我对如何开始使用Copyable界面是个好主意感兴趣…这是我使用的很多代码,并且对我来说效果很好……我最感兴趣的是一般inheritance/设计问题。)

我不清楚如何最好地处理这个问题。 我很感激任何建议。 谢谢。

 public interface Copyable { Copyable getObjectCopy(); } interface ValidateValue extends Copyable { //Other functions... @Override ValidateValue getObjectCopy(); } //For classes that may be able to be Decorated into a TextLineValidator interface ValidLineGettable extends Copyable { //Other functions... ValidLineGettable getObjectCopy(); } interface TextLineValidator extends ValidateValue, ValidLineGettable { //Other functions... @Override TextLineValidator getObjectCopy(); } 

错误:

 C:\java_code\Copyable.java:17: types ValidLineGettable and ValidateValue are incompatible; both define getObjectCopy(), but with unrelated return types interface TextLineValidator extends ValidateValue, ValidLineGettable { ^ 1 error Tool completed with exit code 1 

假设所有返回值都扩展为可Copyable ,则getObjectCopy()的所有版本都返回Copyable。 例如:

 public interface ValidateValue extends Copyable { // Other functions... @Override Copyable getObjectCopy(); } public Blammy implements ValidateValue { // Other functions... @Override public Copyable getObjectCopy() { SomethingThatExtendsCopyable blammy = new SomethingThatExtendsCopyable(); return (Copyable)blammy; } } 

编辑

在上面的代码中,错误是由“getObjectCopy”方法在ValidateValueValidLineGettable接口中具有不同的返回值这一事实引起的,但调用签名是相同的。 在java中,通过仅更改返回值不会获得多态性; 这会导致编译错误。

如果将返回值更改为CopyableTextLineValidator不会通过扩展其两个父接口来获得值。 更简单的方法是使用一个接口(可复制)和实现该接口的多个类,每个类都返回一个可复制值,该值可以是扩展(或实现)可复制的类的实例。

Eclipse编译器可以无错误地编译代码。 JDK 7(1.7.0_45)和JDK 8(1.8.0-ea)的JavaC也可以工作。

我认为这是JDK中的一个错误,很可能是与错误#122881相关的错误 (请注意这一个是修复的)。 我还发现Google协议缓冲区中的一个问题指向另一个错误,但我找不到那个。

您可以使用Eclipse或JDK 7编译它,或更改代码以使其不需要此function。