【问题标题】:why polymorphism not applicable with generics?为什么多态性不适用于泛型?
【发布时间】:2016-01-20 08:46:32
【问题描述】:

下面的代码有什么问题

import java.util.*;

public class Test {
    static class Car {}
    static class bmw extends Car{}

    List<Car> list = new LinkedList<bmw>();
}

编译器显示以下错误:

Test.java:7: error: incompatible types: LinkedList<bmw> cannot be converted to List<Car>
    List<Car> list = new LinkedList<bmw>();
                     ^

为什么它不起作用?

【问题讨论】:

  • 请发布更多代码。 How do I ask a good question?
  • 简单你不能做这个列表必须是一种你可以做这个 List list = new LinkedList();然后 list.add(new bmw());
  • 请帮我解决这个问题

标签: java generics


【解决方案1】:

写的时候适用

List<? extends Car> list = new LinkedList<bmw>();

当您声明List&lt;Car&gt; list 时,您可以将任何汽车放入生成的list(不仅仅是bmw)。所以List&lt;Car&gt; 不是List&lt;bmw&gt;,因为它允许做一些与List&lt;bmw&gt; 不兼容的事情。假设你有

List<Bmw> bmwList = new LinkedList<Bmw>();
List<Car> carList = bmwList; // let's assume this works as you want
carList.add(new Audi()); // works normally: you can put Audi into the list of cars
    // so our bmwList becomes broken here
Bmw bmw = bmwList.get(0); // this should work as we have list of BMW, 
    // but we suddenly got an Audi!

【讨论】:

    【解决方案2】:

    创建 Car 的 List 意味着它将保存 Car 的所有实例,

    • Your bmw is a Car

    • 但是你的Car is not bmw

      所以如果你想在Car 列表中插入bmw,你可以很容易地,但是如果你想插入所有类extending Car,那么你可以使用Tagir 提到的方法。

    【讨论】:

      【解决方案3】:

      作为对 Tagir 回答的补充:JVM 在运行时执行一个称为“类型擦除”的过程。

      这意味着;你的原始清单

      List<Car> list = new LinkedList<bmw>();
      

      变成

      List list = new LinkedList();
      

      在运行时。为了在运行时维护类型安全,编译器在使用泛型时会采取预防措施并执行静态类型检查。

      【讨论】:

        猜你喜欢
        • 2012-01-22
        • 2018-08-30
        • 2012-06-05
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        相关资源
        最近更新 更多