黑马程序员技术交流社区

标题: 我们知道对泛型进行参数化,参数只能是引用类型,可是..... [打印本页]

作者: 胡建彪    时间: 2012-9-20 18:23
标题: 我们知道对泛型进行参数化,参数只能是引用类型,可是.....
public static void main(String[] args)
         {               
                swap(new String[]{"aaa","bbb","ccc"},1,2);
                swap(new int[]{1,2,3,4,5},4,5);
               
          }
        public static <T> void swap (T[] arr ,int i,int j){
                T tem = arr[i];
                arr[i]= arr[j];
        }
第二个swap 总是报错误。 求解
作者: 皮卫凯    时间: 2012-9-20 18:30
swap(new int[]{1,2,3,4,5},4,5);

这位同学,你角标越界了。
角标:0 1 2 3 4
数值:1 2 3 4 5  

4和5 交换 ,5越界啦。
作者: 黑马张涛    时间: 2012-9-20 18:31
  1.         public static void main(String[] args)
  2.         {               
  3.               swap(new String[]{"aaa","bbb","ccc"},1,2);
  4.                swap(new Integer[]{1,2,3,4,5},4,3);//既然知道了泛型的参数只能是引用类型,你为什么要传一个基本类型的参数?
  5.                
  6.         }
  7.        public static <T> void swap (T[] arr ,int i,int j)
  8.        {
  9.                T tem = arr[i];
  10.                arr[i]= arr[j];
  11.                arr[j]=tem;
  12.        }
复制代码

作者: 杨卫腾    时间: 2012-9-20 18:50
public static void main(String[] args)
         {               
                swap(new String[]{"aaa","bbb","ccc"},1,2);
                swap(new Integer[]{1,2,3,4,5},4,5);
               
          }
        public static <T> void swap (T[] arr ,int i,int j){
                T tem = arr[i];
                arr[i]= arr[j];
                arr[j] = tem;
        }
第二个swap 总是报错误?

   其实这个是由于你没有在函数的开始定义类型,泛型,不是基本数据类型呀。
  
  int基本数据类型,你用该使用引用数据类型,所以你应该改成是 Integer

作者: 胡建彪    时间: 2012-9-20 23:54
皮卫凯 发表于 2012-9-20 18:30
swap(new int[]{1,2,3,4,5},4,5);

这位同学,你角标越界了。

我原来的程序有个6的,少写了一个 数字 ,:#
作者: 胡建彪    时间: 2012-9-21 00:05
黑马张涛 发表于 2012-9-20 18:31

我知道泛型的参数只能是引用类型,开始错误的想当然了,泛型 T是定义的数组的类型,而不是定义的数组,而数组的类型中 int 是基本类型不是引用类型。因此 ,此例中需要改成  new Integer[]{1,2,3,4,5,6}.  
Thanks for replying.
作者: 杨华东    时间: 2012-9-21 11:22
public static void main(String[] args)
         {               
                swap(new String[]{"aaa","bbb","ccc"},1,2);
                swap(new Integer[]{1,2,3,4,5},4,5);
               
          }
        public static <T> void swap (T[] arr ,int i,int j){
                T tem = arr[i];
                arr[i]= arr[j];
                arr[j] = tem;
        }
第二个swap 总是报错误?

首先肯定的,做得很好 用到了自动装箱和拆箱(值得借鉴)。
但是呢 你的  角标越界了
函数是正确的:
        public static <T> void swap (T[] arr ,int i,int j){
                T tem = arr[i];
                arr[i]= arr[j];
                arr[j] = tem;
        }
这里越界了:swap(new Integer[]{1,2,3,4,5},4,5);
原因:数组new Integer[]{1,2,3,4,5}的长度是5 最大角标是5-1=4!!你却写出了带有5的角标!!!!
简单的问题。




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