【问题标题】:"Attempting to use an incompatible return type" with Interface Inheritance带有接口继承的“尝试使用不兼容的返回类型”
【发布时间】:2015-09-01 21:45:11
【问题描述】:

我在使用继承时遇到了返回类型不兼容的问题。

public interface A { }
public interface B extends A { }

public interface C {
    Map<String, A> getMapping();
}

public interface D extends C {
    Map<String, B> getMapping();
}

有没有办法让它工作?

现在编译器告诉我我正在接口 D 上“尝试使用不兼容的返回类型”。

【问题讨论】:

  • @alfasin 正确,问题已更新 - 抱歉!
  • 这对您的问题来说是一个很大的变化。 @user3707125:那么有你的解决方案。
  • 听起来像是一个答案...

标签: java inheritance interface


【解决方案1】:

作为已接受答案的补充,我在使用嵌套类型数据结构时遇到了问题。例如,如果您在接口中创建一个抽象方法,例如:

Collection<Collection<? extends InterfaceB>> doSomething();

那么接受的答案将意味着这应该有效:

@Override
Collection<Collection<InterfaceBImplementation>> doSomething() {

... doing stuff...

return stuff;
}

但是,您将收到相同的冲突/不兼容返回类型错误。相反,您还必须在抽象方法中对内部集合进行通配符:

Collection<? Collection<? extends InterfaceB>> doSomething();

我不明白为什么会这样,或者为什么会这样设置,但是你去吧。

【讨论】:

    【解决方案2】:

    进行以下更改:

    interface C<E extends A> {
        Map<String, E> getMapping();
    }
    
    interface D extends C<B> {
        Map<String, B> getMapping();
    }
    

    【讨论】:

      【解决方案3】:

      我建议你使用

      interface C {
          Map<String, ? extends A> getMapping();
      }
      

      这表示“将String 映射到AA 的子类型的映射”。这与Map&lt;String, B&gt; 兼容。

      【讨论】:

      • 是的!这让我发疯了。我有一个声明为返回Set&lt;MyObjectInterface&gt; 的接口方法和一个设置为返回Set&lt;MyObject&gt; 的实现类。这导致了问题中的错误。将接口声明更改为Set&lt;? extends MyObjectInterface&gt; 解决了我的问题。谢谢!
      • 非常感谢。这让我发疯,这是一个非常简单的解决方法。
      • Java 什么时候会实现真正的多态......而不是让程序员使用变通方法?
      • 这似乎不适用于嵌套的通用容器。我为返回 Collection&lt;Collection&lt;? extends MyInterface&gt;&gt; 的方法尝试了类似的方法,但仍然出现错误。我确实尝试过使用独立的 Collection 并且它可以工作。
      猜你喜欢
      • 1970-01-01
      • 2012-05-08
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-15
      • 2020-06-08
      • 2015-02-11
      相关资源
      最近更新 更多