黑马程序员技术交流社区

标题: 关于泛型问题2 [打印本页]

作者: 浪无痕-陈文坤    时间: 2013-8-6 19:14
标题: 关于泛型问题2
本帖最后由 浪无痕-陈文坤 于 2013-8-6 22:24 编辑

import java.util.*;

class Vehicle
{
}
class CarA extends Vehicle
{
}
class CarB extends Vehicle
{
}
public class Hello
{

         public static void main(String[] args)
         {
                List<? extends Vehicle> list = new ArrayList<Vehicle>();
                list.add(new Vehicle());
                //list.add(new CarA());
        
         }
        
}
}
红色部分:为什么一向里面添加对象就失败?<? extends Vehicle>这样有什么作用?谢谢

作者: xkfxm    时间: 2013-8-6 19:23
楼主好,这个地方 List<? extends Vehicle> list = new ArrayList<Vehicle>();
你是希望list中加入的只能是Vehicle的对象及其子类对象,
写成 List<Vehicle> list = new ArrayList<Vehicle>();就可以了,以为list中可以添加Vehicle类的实例对象,那他的子类对象也可以看成是Vehicle的对象(多态);
按照你写的就变成了 <? extends ? extends Vehicle>.
希望能帮到你。共同学习。谢谢
作者: taotao    时间: 2013-8-6 20:24
本帖最后由 taotao 于 2013-8-6 20:25 编辑

泛型限定
<? extends E>只能接受E类型,或E类型的子类型。
<? super E>只能接受E类型,或E类型的父类型。
你的用法有问题,所谓泛型,只是起到一个占位的作用,用来告诉你这地方你可以定义类型。它不属于任何类型,所以你把它直接拿来当类型用时不对的。
在用它之前你必须得告诉它,它是什么类型。你可以这么用:
  1. import java.util.*;

  2. class Vehicle
  3. {
  4. }
  5. class CarA extends Vehicle
  6. {
  7. }
  8. public class test
  9. {

  10.          public static void main(String[] args)
  11.          {
  12.                 ArrayList<Vehicle> list_1 = new ArrayList<Vehicle>();
  13.                 list_1.add(new Vehicle());
  14.                 list_1.add(new Vehicle());

  15.                 ArrayList<CarA> list_2 = new ArrayList<CarA>();
  16.                 list_2.add(new CarA());
  17.                 list_2.add(new CarA());

  18.                 taoge(list_1);
  19.                 taoge(list_2);
  20.          }
  21.         public static void taoge(ArrayList<<font color="#ff0000">? extends Vehicle</font>> a1)
  22.         {
  23.                
  24.         }
  25. }
复制代码
看看你能理解不,有问题再问
作者: Mr_Free    时间: 2013-8-6 20:58
list 类型现在是是List<? extends Vehicle>,你可以将其读作“具有任何从Vehicle继承的类型的列表”,但是这实际上并不意味着这个List将持有任何类型的Vehicle。通配符引用的是明确的类型,因此他意味着“某种Vehicle引用没有指定的具体类型”。因此,这个被赋值的List必须持有诸如CarA CarB这样的某种指定类型,但是为了向上转Vehicle,这个类型是什么,并没有人关心。
如果唯一的限制是这个List要持有某种具体的Vehicle类或者子类,但是你实际上并不关心他是什么。那么你能用这样的List做什么呢?如果不知道List持有什么类型,那么你怎样才能安全的向其中添加对象呢?
虽然编译器允许你  ArrayList<CarA> list_2 = new ArrayList<CarA>(); 一旦执行这种类型的向上转型,你就将丢失掉向其中传递任何对象的能力,甚至是传递Object也不行。
作者: 浪无痕-陈文坤    时间: 2013-8-6 22:23
xkfxm 发表于 2013-8-6 19:23
楼主好,这个地方 List

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-6 22:24
taotao 发表于 2013-8-6 20:24
泛型限定

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-6 22:26
Mr_Free 发表于 2013-8-6 20:58
list 类型现在是是List

非常感谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2