gpt4 book ai didi

java - 为什么不能在 Java 中将类型为 的对象存储在类型为 的容器中?

转载 作者:行者123 更新时间:2023-12-04 11:10:16 25 4
gpt4 key购买 nike

我已经创建了一个界面:

MyList<E> extends List<E>{
...
}

然而,当我尝试这样做时:MyList<_MyClass> = new LinkedList<_MyClass>() , 我得到一个编译器错误。

如果MyList根据定义,所有方法都在 List 中,为什么我不能分配它?如果我尝试转换它,我会得到一个运行时转换异常。

我错过了什么?

编辑。感谢大家的回复。我认为您可以将它与新的 1.8 默认方法结合使用,以破解诸如 C# 扩展方法之类的东西。 IE。 MyList 有一堆用于处理 List 的默认方法(没有其他方法),但我现在明白为什么这在概念上是不可能的。

最佳答案

从更简单的界面的角度考虑它。

假设核心库有一个 Animal 接口(interface)。还有一个名为 Dog 的实现。也就是说,Dog 实现了 Animal。

现在你来创建一个名为 Human 的 Animal 的新实现。

人类也实现了动物。

所以现在我可以做到这一点。

Animal  a1, a2;
a1 = new Dog();
a2 = new Human();

但我不能这样做。

Human h = new Dog();

当然,人和狗都是动物,但狗不可能代替人。那是那里的编译时异常。

现在您的情况稍微复杂一些。

List是你的主要接口(interface),核心实现是LinkedList。也就是说,LinkedList 实现了 List。

扩展我的类比,您创建了一个名为 HumanList 的新类,它也扩展了 List。

所以重复我之前做的,你可以做到这一点。

List<String>  b1, b2;

b1 = new LinkedList<String>;
b2 = new HumanList<String>;

但是你不能这样做。

HumanList<String> = new LinkedList<String>.

当然,HumanList 和 LinkedList 都是 List 的实现。但是 LinkedList 不能在所有情况下都代表 HumanList。

这是因为除了 List 接口(interface)之外,您的 HumanList 实现可能还有其他方法,例如 displaySocialSecurityNumbers()。

如果您的 HumanList 除了 List 之外没有其他方法,并且您永远不需要它这样做,那么您可以执行以下操作。

List<E>  b2 = new HumanList<E>();

最后,正如 Xgord 已经建议的那样,如果您想建议您的 HumanList 是一种 LinkedList,那么您应该让 HumanList 扩展 LinkedList。

关于java - 为什么不能在 Java 中将类型为 <ParentInterface> 的对象存储在类型为 <ChildInterface> 的容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38237764/

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