【问题标题】:java cast from List<B> to List<A> where B extends Ajava 从 List<B> 转换为 List<A> 其中 B 扩展 A
【发布时间】:2011-12-03 04:34:56
【问题描述】:

这可能吗?如果不是,为什么这在 Java 中不可能?

interface B extends A {}
public List<B> getList();
List<A> = getList(); // Type mismatch: cannot convert from List<B> to List<A>

我认为我正在寻找的主题是“协变类型”,如 herehere,但它很模糊,并不能解决我的问题。

【问题讨论】:

标签: java types casting covariance


【解决方案1】:

这是一个直观的例子,说明这如何使事情变得非常糟糕:

interface B extends A {}
List<B> blist=new List<B>();
List<A> alist=blist;
alist.add(new A()); //should be ok, right?
B b = blist.get(0); //fail: even though blist is a List<B>, it now has an A in it

【讨论】:

  • 嗯。如果我用List&lt;? extends A&gt; 使编译器静音,似乎这个问题仍然存在?编辑:不,我推测错误会移至 L4。很酷。
【解决方案2】:

试试

List<? extends A> = getList()

【讨论】:

    【解决方案3】:

    你不能这样做的原因是A和B不一样,你已经指定getList返回一个B的List(不是超类也不是子类)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 2021-04-03
      • 2012-10-11
      • 1970-01-01
      • 2019-12-09
      • 2011-12-06
      • 1970-01-01
      相关资源
      最近更新 更多