gpt4 book ai didi

java - 为什么在java中不允许将子类对象的子类集合转换为其父类(super class)对象的父类(super class)集合?

转载 作者:行者123 更新时间:2023-12-01 15:28:45 26 4
gpt4 key购买 nike

代码也位于 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 的子类时,为什么我必须强制转换它?

最佳答案

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

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

关于java - 为什么在java中不允许将子类对象的子类集合转换为其父类(super class)对象的父类(super class)集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9832396/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com