小编典典

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

java

我具有以下接口层次结构(删除了所有不相关的功能)。尝试编译时出现此错误:

types ValidLineGettable and ValidateValue<java.lang.String> are incompatible; both define getObjectCopy(), but with unrelated return types

这些都是从相同的函数派生而来的-不是两个具有相同名称 的不同函数,在同一接口中的相同函数 。你如何处理与接口 必须 从两个不同的接口继承
自己 必须从单一基接口继承?

就我而言,它在概念上和名称上都是相同的功能。

(尽管我对Copyable接口是否是一个好主意感兴趣,但是我对它的使用很感兴趣。它在我使用的 许多
代码中都很好,并且对我来说效果很好…我对通用继承/设计最感兴趣。题。)

我不清楚如何最好地处理此问题。我将不胜感激任何建议。谢谢。

public interface Copyable  {
   Copyable getObjectCopy();
}
interface ValidateValue<O> extends Copyable  {

   //Other functions...

   @Override
   ValidateValue<O> 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<String>, ValidLineGettable  {

   //Other functions...

   @Override
   TextLineValidator getObjectCopy();
}

错误:

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

 Tool completed with exit code 1

阅读 207

收藏
2020-11-30

共1个答案

小编典典

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

public interface ValidateValue<O> extends Copyable
{
     // Other functions...

     @Override
     Copyable getObjectCopy();
}

public Blammy implements ValidateValue<String>
{
    // Other functions...

     @Override
    public Copyable getObjectCopy()
    {
        SomethingThatExtendsCopyable blammy = new SomethingThatExtendsCopyable();

        return (Copyable)blammy;
    }
}

编辑

在上面的代码中,错误是由以下事实引起的:“
getObjectCopy”方法在ValidateValue<String>ValidLineGettable接口中具有不同的返回值,但调用签名相同。在Java中,仅通过更改返回值就不会获得多态。这会导致编译错误。

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

2020-11-30