带有接口继承的“尝试使用不兼容的返回类型”
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
映射到A
或A
的子类型的映射”。这与Map<String, B>
兼容。
【讨论】:
是的!这让我发疯了。我有一个声明为返回Set<MyObjectInterface>
的接口方法和一个设置为返回Set<MyObject>
的实现类。这导致了问题中的错误。将接口声明更改为Set<? extends MyObjectInterface>
解决了我的问题。谢谢!
非常感谢。这让我发疯,这是一个非常简单的解决方法。
Java 什么时候会实现真正的多态......而不是让程序员使用变通方法?
这似乎不适用于嵌套的通用容器。我为返回 Collection<Collection<? extends MyInterface>>
的方法尝试了类似的方法,但仍然出现错误。我确实尝试过使用独立的 Collection 并且它可以工作。以上是关于带有接口继承的“尝试使用不兼容的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章