A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 卞潇洋 中级黑马   /  2012-11-21 19:02  /  1616 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在学java的路途中,让我唯一感觉可怕的就是泛型了,很容易晕,下面就遇到了一个问题:
public class TestLegacy{
     public static void main(String args[]){
       List<Integer> myList = new ArrayList<Integer>();
       myList.add(4);
       myList.add(6);
       Adder adder = new Adder();
       int total = adder.addAll(myList);
       System.out.println(total);
}
class Adder {
     int addAll(List list){
            Iterator it = list.iterator();
            int total = 0;
           while(it.hasNext()){
            int i = ((Integer)it.next()).intValue();
            total +=1;
}
            rturn total;
}
}
}
如果调用addAll()方法当然没什么问题,但如果换成这样
public class TestBadLegacy{
     public static void main(String[] args){
            List<Integer> myList = new ArrayList<Integer>();
            myList.add(4);
            myList.add(6);
           Inserter in = new Inserter();
           in.insert(myList);
}
}
class Inserter{
          void insert(List list){
            list.add(new String("42"));
}
}
它竟然能执行,没有报错,这是为什么啊?请大狭们解答一下啊,谢谢啊

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

4 个回复

倒序浏览
本帖最后由 陈德基 于 2012-11-21 19:41 编辑

泛型相当于集合的类型参数,限定集合中元素的类型。我想应该是自动装箱的功能起作用,list.add(4)将原先是int型的数字4添加到集合中会有自动装箱的动作,就像new Integer(4)这样。同样list.add(new String("42")),同理new Integer(new String("42"))。这样编译和运行都没有问题。但是要注意添加的String对象内容要是数字,如果是字符串就不行了。
回复 使用道具 举报
传参过程:
List lsit = new ArrayList<Integer>();
相当于
list没有 泛型限定 所以 你加什么都通过
如果 把 intsert 方法改成形参改为:List<Integer>list
结果就不同了

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
葬天 发表于 2012-11-21 19:53
传参过程:
List lsit = new ArrayList();
相当于

有点门路了,谢谢
回复 使用道具 举报
要先了解泛型的规则和限制

 1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
  2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
  3、泛型的类型参数可以有多个。
  4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
  5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
  泛型还有接口、方法等等,内容很多,需要花费一番功夫才能理解掌握并熟练应用。在此给出我曾经了解泛型时候写出的两个例子(根据看的印象写的),实现同样的功能,一个使用了泛型,一个没有使用,通过对比,可以很快学会泛型的应用,学会这个基本上学会了泛型70%的内容。
  例子一:使用了泛型
  class Gen<T> {
  private T ob; //定义泛型成员变量
  public Gen(T ob) {
  this.ob = ob;
  }
  public T getOb() {
  return ob;
  }
  public void setOb(T ob) {
  this.ob = ob;
  }
  public void showType() {
  System.out.println("T的实际类型是: " + ob.getClass().getName());
  }
  }
  public class GenDemo {
  public static void main(String[] args){
  //定义泛型类Gen的一个Integer版本
  Gen<Integer> intOb=new Gen<Integer>(88);
  intOb.showType();
  int i= intOb.getOb();
  System.out.println("value= " + i);
  System.out.println("----------------------------------");
  //定义泛型类Gen的一个String版本
  Gen<String> strOb=new Gen<String>("Hello Gen!");
  strOb.showType();
  String s=strOb.getOb();
  System.out.println("value= " + s);
  }
  }

可以更好的理解泛型

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马