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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 皮卫凯 中级黑马   /  2012-9-24 21:28  /  1582 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 皮卫凯 于 2012-9-24 23:17 编辑

private static <T> viod  swap (T[]a,int i,int j)
{
      T tmp=a;
      a=a[j];
      a[j]=tmp;
}

swap (new String[] {"abc","def","itheima"},1,2)
swap (new int[]{1,3,5,6,7,9},3,4)

定义一个泛型的交换方法
为什么第二句会报错。
第一句能执行,按理第二句也能执行啊。
  
张老师的视频中说到 编译器不会对new int [] 的 int自动的拆箱和装箱。与上面泛型的swap 有关系咩。
想不通了,求解答。

已经解答。
自定义泛型中的变量 T  是指一种不包括基本数据类型(char ,int ,boolean...  )的类型
swap (new int[]{1,3,5,6,7,9},3,4)
应该改为
swap (new Integer[]{1,3,5,6,7,9},3,4)
谢谢大家。

4 个回复

倒序浏览
swap (new String[] {"abc","def","itheima"},1,2)
这一句你已经把泛型定义成了String
然后swap (new int[]{1,3,5,6,7,9},3,4)
泛型被擦写了 现在根本不知道他是不是Intent类型的 所以。。。。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
自定义泛型中的变量T是指一种不包括基本数据类型(int,char,boolean....)的类型。
swap (T[]a,int i,int j)
swap (new int[]{1,3,5,6,7,9},3,4)

      这里把int型当成了T,显然T不包括8种基本数据类型。
    张老师的视频中说到 编译器不会对new int [] 的 int自动的拆箱和装箱。
    而Integer在这里就可以,但是编译器不会自动的把int[]变成Integer[],所以就编译失败了。
如果你改成

     swap (new Integer[]{1,3,5,6,7,9},3,4);
这样就可以了。

回复 使用道具 举报
这里swap (new int[]{1,3,5,6,7,9},3,4)报错是正常的,因为虽然泛型能完成自动装箱,但是int[]不能被识别为Integer【】的包装类,所以不会装箱为Integer[]所以这里把int【】改成Integer【】就可以了。另外阁下的代码有点问题;经本人纠正,代码如下:
package liu.test.eclipse;

public class SwapTest {

        /**
         * @param args
         */
        public static void main(String[] args) {
                String[] str=new String[]{"abc","def","itheima"};
                Integer[] in=new Integer[]{1,3,5,6,7,9};
                swap (str,1,2);
                 swap (in,3,4);
                 show(str);
                 show(in);

        }
        private static <T> void  swap (T[]a,int i,int j)
         {
               T tmp=a[i];
               a[i]=a[j];
               a[j]=tmp;
         }
        private static <T> void show(T[]a){
                for(T x:a)
                System.out.println(x);
        }
         
}
运行结果:
abc
itheima
def
1
3
5
7
6
9

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
  1. class Problem1
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 String[] arr=new String[] {"abc","def","itheima"};
  6.                 swap (arr,1,2);
  7.                
  8.                 //这是不行的额,泛型要是作用在对象的层面上,
  9.                 //你在上面也说了,编译器不会对new int[]的 int自动的拆箱和装箱。
  10.                 //int[] arr1=new int{1,3,5,6,7,9};
  11.                
  12.                 //所以需要声明数组中的是Integer对象
  13.                 Integer[] arr1=new Integer[]{1,3,5,6,7,9};
  14.                 swap (arr1,3,4);

  15.         }
  16.         public static <T> void swap (T[]a,int i,int j)
  17.         {
  18.       T tmp=a[i];
  19.       a[i]=a[j];
  20.       a[j]=tmp;

  21.           for(T t:a)
  22.                 {
  23.                         System.out.println(t);
  24.                 }
  25.         }
  26. }
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马