怎么纠正? – “都定义了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”方法在ValidateValue
和ValidLineGettable
接口中具有不同的返回值这一事实引起的,但调用签名是相同的。 在java中,通过仅更改返回值不会获得多态性; 这会导致编译错误。
如果将返回值更改为Copyable
则TextLineValidator
不会通过扩展其两个父接口来获得值。 更简单的方法是使用一个接口(可复制)和实现该接口的多个类,每个类都返回一个可复制值,该值可以是扩展(或实现)可复制的类的实例。
Eclipse编译器可以无错误地编译代码。 JDK 7(1.7.0_45)和JDK 8(1.8.0-ea)的JavaC也可以工作。
我认为这是JDK中的一个错误,很可能是与错误#122881相关的错误 (请注意这一个是修复的)。 我还发现Google协议缓冲区中的一个问题指向另一个错误,但我找不到那个。
您可以使用Eclipse或JDK 7编译它,或更改代码以使其不需要此function。