2016-01-20 58 views
-4

什么是下面的代码为什么多态性不适用于仿制药?

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>(); 
        ^

为什么它不工作?

+0

请发表更多代码。 [我如何问一个好问题?](http://stackoverflow.com/help/how-to-ask) –

+0

简单的你不能做这个列表必须是一种类型,你可以做这个列表 list = new LinkedList ();然后list.add(new bmw()); – Piyush

+0

请帮我这个 – Binu

回答

2

当你写

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

这是适用在声明List<Car> list,你可以把任何车所产生的list(不只是bmw)。所以List<Car>不是List<bmw>,因为它允许做一些与List<bmw>不兼容的东西。假设你有

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! 
+0

很好的解释 – AdamSkywalker

+0

感谢和nive的解释 – Binu

0

打造汽车的List意味着将持有的Car所有实例,

  • Your bmw is a Car
  • 但你Car is not bmw

    ,所以如果你想插入bmw在清单Car你可以很容易,但如果你想插入所有类extending车然后你可以使用Tagir提到的方法。

+0

感谢您的回答 – Binu

0

作为Tagir答案的补充:JVM在运行时执行一个名为“Type Erasure”的过程。

这意味着;你原来的列表

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

变为

List list = new LinkedList(); 

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

+0

感谢您的答案 – Binu