带有接口继承的“尝试使用不兼容的返回类型”

Posted

技术标签:

【中文标题】带有接口继承的“尝试使用不兼容的返回类型”【英文标题】:"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:那么有你的解决方案。 听起来像是一个答案... 【参考方案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 并且它可以工作。

以上是关于带有接口继承的“尝试使用不兼容的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章

适配器模式

Python抽象类和接口类

继承 接口 多态

Python__接口与归一化设计

OC编程之道-接口适配之适配器

设计模式-结构型