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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class YinYong {

  2.         public static void main(String[] args) {
  3.                 int[] arr = { 5, 4, 3, 2, 1 };
  4.                 swap(arr, 0, 1);//这句话编译不通过
  5.         }
  6.         public static <T> void swap(T[] t, int i, int j) {
  7.                 T temp = t[i];
  8.                 t[i] = t[j];
  9.                 t[j] = temp;
  10.         }
  11. }
复制代码

泛型类型参数化只能是引用类型,不能是基本数据类型。
可是int数组是引用类型啊,怎么不可以?

9 个回复

倒序浏览
本帖最后由 Seven` 于 2014-9-17 16:51 编辑

你定义的数组是一个int类型的,数组中的元素都是int类型,也就是说都是基本数据类型;
  •         public static <T> void swap(T[] t, int i, int j) {
  •                 T temp = t;
  •                 t = t[j];
  •                 t[j] = temp;
  •         }
这个方法中的t和t[j]就都是int类型了
你可以换成Integer试试;
如有错误请指正
回复 使用道具 举报
Seven` 发表于 2014-9-17 16:49
你定义的数组是一个int类型的,数组中的元素都是int类型,也就是说都是基本数据类型;
  •         public s ...

  • 理解偏了,T是泛型,指的是所有Object的子类,如果定义int[]数组,那int就应该能继承于Ojbect;
    很明显int是基本数据类型,所以是不行的
    回复 使用道具 举报
    为什么非得用泛型,直接int temp=t【i】,t【i】=t【j】;t【j】=temp;不好吗?
    回复 使用道具 举报
    学习一下……
    回复 使用道具 举报
    学习了,谢谢
    回复 使用道具 举报
    因为泛型只支持引用数据类型,数组是一种特殊的类型,基本数据类型组成的数组不是纯引用数据类型
    回复 使用道具 举报
    int数组是引用,但是里面存储的是基本数据类型,所以不可以,你改为Integer就可以了
    回复 使用道具 举报
    本帖最后由 荣英洁 于 2014-9-20 12:08 编辑

    编译不能通过的原因是 int  不是类类型,学习过反射都知道,任何一个类,都有一个字节码,通过类名.class获得,或者对象名.getClass(),但是却没有int.class  可见int 不是类。泛型的占位符表示的是一个通用的类,既然int 不是类 自然编译通不过。int 的设计是为了符合大家编写代码的习惯,和加快运算。int的包装类型Integer,所以可以用Integer 代替 int 就能通过编译;      
      int[] arr = { 5, 4, 3, 2, 1 };
             Integer []aa=null;
             aa = new Integer[arr.length];
             for (int i = 0; i < arr.length; i++) {
             aa【i】=arr【i】;
       }
             swap(aa, 0, 1);//这句话编译可以通过
    同样的道理还有 double,float,char 等 都不是类,用到泛型是要用 他们的包装类型。
    回复 使用道具 举报
    学习了……
    回复 使用道具 举报
    您需要登录后才可以回帖 登录 | 加入黑马