首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口问题

Java接口问题
EN

Stack Overflow用户
提问于 2010-12-22 07:06:09
回答 3查看 259关注 0票数 4

假设我有两个接口,A和B:

代码语言:javascript
复制
public interface A {
 List<B> getBs();
}

public interface B {
}

和两个实现这些接口的类:

代码语言:javascript
复制
public class AImpl implements A {

 public List<B> getBs() {
  return null;
 }

}


public class BImpl implements B {
}

是否可以(也许使用泛型)让我的getter方法返回一个BImpl类型的对象列表,如下所示:

代码语言:javascript
复制
public class AImpl implements A {

 public List<BImpl> getBs() {
  return null;
 }

}

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-22 07:09:30

我认为您需要将接口声明更改为:

代码语言:javascript
复制
public interface A {
 List<? extends B> getBs();
}

但是,如果您想让客户端知道您使用的是哪种实现类型,事情将变得更加复杂:

代码语言:javascript
复制
public interface A<C extends B> {
     List<C> getBs();
}

public class AImpl implements A<Bimpl>{
     public List<Bimpl> getBs();
}
票数 6
EN

Stack Overflow用户

发布于 2010-12-22 07:09:02

仅当您可以将A.getBs()方法的定义更改为:

代码语言:javascript
复制
List<? extends B> getBs();
票数 3
EN

Stack Overflow用户

发布于 2010-12-22 07:11:37

不是,因为泛型类型不是协变的。

List<BImpl>不是List<B>的子类。

接口A中方法的契约的一部分是它返回一个List<B>

代码语言:javascript
复制
public interface A {
 List<B> getBs();
}

List<BImpl>不支持该协定。例如,期望List<B>的收件人可能会尝试将其他类型B的实例添加到列表中--比如BImpl2BImpl3

只包含BImpl的List<B>将支持该约定。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4504800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档