当前位置: 首页 > 面试题库 >

Java泛型—将子类列表分配给超类列表

通博实
2023-03-14
问题内容

我有一个关于将子类列表分配给超类列表的基本问题。

所以我有以下内容:

Class B extends A;

List <B> bList = new ArrayList<B>();
List <A> aList = bList;

为什么最后一次分配失败?对不起,新手问题


问题答案:

为了解释这一点,让我用整数代替“ B”,用数字代替“ A”。这只是为了使其更容易解释。

Class Integer extends Number;

List <Integer> iList = new ArrayList<Integer>();
List <Number> nList = iList // will fail

失败的原因是因为nList可以采用任何Number;可以采用Integer;可以采用Double;或者就此而言,可以是Number的任何子类。但是,对于iList并非如此。您不能将Double添加到iList,因为它仅接受Integer及其子类。希望这有助于向您解释。



 类似资料:
  • 问题内容: 我有几个提供的接口 和一个实现第一个的类: 如果我不能更改任何接口,那么在保持实现尽可能通用的同时最好的做法是什么? 编辑 我无法中断实例化的其他一些代码, 因此我在实现中也应该有两种通用类型。 问题答案: 问题是显然不是。Java是强类型的,不会允许您执行此类操作。 您可以将其强制转换为,在这种情况下,您仍然会收到有关未经检查的转化的警告。这意味着此转换是 不安全的 。 或直接使用代

  • 问题内容: 例如,假设你有两个类: 我有一个返回a的方法,List 并且我想将列表中的所有对象都强制转换为,TestB以便最终得到 问题答案: 简单地铸造几乎可行;但这是行不通的,因为你不能将一个参数的泛型类型转换为另一个参数。但是,你可以强制转换中间通配符类型,并且将允许它(因为你可以强制转换为通配符类型或从通配符类型强制转换,只是带有未选中的警告):

  • 我发现它能够以这种方式或通过抛出进行子类化,没有问题,但类型检查。 当您的子类列表工作时,方式相同。 如何才能正确子类化tuple?谢谢你的建议。

  • 我尝试了几种解决方案,但都不管用

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。