【问题标题】:Why is casting a sub-classed collection of subclassed objects to its superclass collection of superclass objects not allowed in java? [duplicate]java - 为什么在java中不允许将子类对象的子类集合转换为其超类对象的超类集合? [复制]
【发布时间】:2012-03-23 11:02:32
【问题描述】:

代码也在https://github.com/timp21337/java-generics-example

package a;

import java.util.List;

public interface Container<T> {
  List<T> getThings();
}

public class ContainerContainer {
  public Container<Thing> getThingContainer() {
    return new ThingContainer<Thing>();
  }
}

public class ThingContainer<T extends a.Thing> implements Container<T> {
  @Override
  public List<T> getThings() {
    return null;
  }
}

public class Thing {
}

包b

package b;
import java.util.List;

public class ContainerContainer extends a.ContainerContainer {
  ThingContainer<Thing> thingContainer = new ThingContainer<Thing>();
  @SuppressWarnings("unchecked")
  public a.Container<a.Thing> getContainer() {
    return (a.Container<a.Thing>)(Object)thingContainer; //YUCK
  }
}

public class ThingContainer<T extends a.Thing> 
     implements a.Container<T> {
  @Override
  public List<T> getThings() {
    return null;
  }
}

public class Thing extends a.Thing {
}

我的问题是为什么我必须强制 b.ThingContainer(上面标记为 YUCK)当它是 a.ThingContainer 的子类并且它包含的东西是 a.Thing 的子类时?

【问题讨论】:

  • 我认为这回答了你的问题。 stackoverflow.com/q/6044329/422353
  • +1 表示写得很好的问题; -1 表示不先搜索答案;净:0
  • 谢谢@madth3,是的,特别是en.wikipedia.org/wiki/…>的链接
  • 谢谢@Jim-Garrison,我确实搜索过,但我找到的答案是相反的问题

标签: java generics


【解决方案1】:

让我们考虑一个更简单的例子,删除所有不相关的细节。 (这里,我们将使用String而不是b.Thing,而不是a.Thing,我们将使用ObjectStringObject的子类,所以它是类似的。而不是a.Container,我们将使用List。容器的子类化是无关紧要的,正如您将看到的。)如果您能理解为什么这个示例不起作用,您就会理解您的问题。

List<String> foo = new ArrayList<String>();
List<Object> bar = foo; // why doesn't this work?

【讨论】:

  • 很抱歉,我不确定没有经验的人是否会通过这两行代码更好地理解您的示例。
  • 因为 bar 现在可以接受可能通过 foo 错误访问的整数。谢谢@newacct
猜你喜欢
  • 2013-09-03
  • 2018-12-16
  • 2022-06-10
  • 2012-07-22
  • 2014-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多