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

List

糜鸿风
2023-03-14
问题内容

我对Java泛型如何处理继承/多态感到困惑。

假设以下层次结构-

Animal (Parent)

Dog - Cat (Children)

所以,假设我有一个方法doSomething(List<Animal> animals)。通过将所有继承和多态的规则,我会假设List<Dog> 是一个List<Animal>List<Cat> 是一个List<Animal>-所以任何一个可以传递给此方法。不是这样 如果要实现此行为,则必须通过说出明确告诉该方法接受Animal的任何子类的列表doSomething(List<? extends Animal> animals)

我了解这是Java的行为。我的问题是为什么?为什么多态性通常是隐式的,但是当涉及泛型时,必须指定它?


问题答案:

不,List<Dog>是不是一个List<Animal>。考虑一下您可以做什么List<Animal>-您可以向其中添加任何动物…包括猫。现在,您可以在逻辑上将猫添加到一窝小狗中吗?绝对不。

// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?

突然,你有一只非常困惑的猫。

现在,您不能将a添加Cat到,List<? extends Animal>因为您不知道它是一个List<Cat>。您可以检索一个值并知道它将是一个值Animal,但不能添加任意动物。相反的情况是正确的List<? super Animal>-在这种情况下,您可以Animal安全地向其中添加一个,但是对于从中检索到的内容一无所知,因为它可能是个List<Object>



 类似资料:
  • 问题内容: import java.awt.List; import java.awt.image.BufferedImage; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.InputStreamReader; import java

  • 问题内容: 如果JSP中存在某些值,则需要隐藏一个元素 值存储在列表中,所以我尝试了: 但是,它不起作用。 如何评估列表是否包含JSTL中的值,列表和值是字符串。 问题答案: 可悲的是,我认为JSTL除了支持所有元素的迭代来解决这个问题外,不支持任何其他功能。过去,我在核心标签库中使用过forEach方法: 运行之后,如果myList包含myValue,则$ {contains}将等于“ true

  • 问题内容: 我有一个ListView,它显示TextViews的列表。我希望每个TextView以适当的字体显示。作为字体String []数组的一部分出现在ListView中的字体名称的拼写与创建字体时的拼写相同。 和XML: 为什么我不能在ListView中获得每个TextView正确的字体? 问题答案:

  • 问题内容: 我浏览了教程并进行了搜索,但仍然不明白该怎么做, 当扩展在我的android应用程序中创建自定义listView 时,此方法有效。因此,我无法完全按照需要编辑“自定义”列表视图。 我需要知道何时调用此方法以及参数的含义。 如果有人可以解释以下方法很好。谢谢 问题答案: getView() :如规范中所述,getView方法将数据显示在指定位置。因此,当您设置适配器并滚动时,将调用lis

  • 问题内容: 我创建了一个自定义列表视图,在每行的左侧有两个箭头(向上/向下投票)。使用选择器,我已经能够更改箭头的图像(颜色)并相应地更新投票。我的问题是,例如,如果我单击“投票”,则当我向下滚动足够远以使我投票过的列表项退出屏幕时,它将重置为原始未选中状态/图像。 这是我的获取视图方法 问题答案: 所以我自己弄清楚了。这是由于对教程的深刻理解造成的。 我将一个对象传递给我的自定义适配器,我要做的

  • 问题内容: 我正在将值放入形式的哈希图中, 我想使用map方法创建一个列表。 要么 但是,它将引发异常: 线程“主”中的异常java.lang.ClassCastException: java.util.HashMap $ Values无法转换为java.util.List 但是它允许我将其传递给列表的创建: 问题答案: 说明 因为返回a ,而不能将a 转换为an ,所以得到。 我建议使用构造函数

  • 问题内容: 原始列表将转换为正常。为什么原始列表的列表不能转换为的列表? 背景故事(以减轻xy问题): 我正在使用return的API List 。我碰巧知道它一直都是 。我计划循环并构建自己的循环 ,但是我在尝试编写时试图修复(但不禁止)原始类型编译器警告 ;。 我试过了: 但是这些会导致类型不匹配错误。 有趣的是,这没有给出警告或错误: 问题答案: 首先让我们弄清楚为什么这些实际上是不相关的分

  • 问题内容: 我用数据库搜索的结果修改了,以便稍后使用该选择提出另一个数据库请求。 我想获取该字段的值。我可以使用哪种方法? 我只是以为我也可以向中添加事件,并将其保留在控制器的属性中。那也可以接受吗? 问题答案: 用这样的列表视图说: 从ListView获取选定的元素: 跟踪(监听)列表视图选择中的更改: