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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 任亚俊 中级黑马   /  2014-1-2 15:30  /  1994 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下,有一句话不能通过编译,不知道为什么:
  1. private <T> void vary1(T... nums){
  2.                
  3.         }
  4.         @Test
  5.         public void testVary1() {
  6.                 int[] arr={2,3};
  7.                 vary1(arr,1);//可以通过编译
  8.         }
  9.        
  10.         private void vary2(int... nums){
  11.                
  12.         }
  13.         @Test
  14.         public void testVary2() {
  15.                 int[] arr={2,3};
  16.                 vary2(arr,1);//不可以通过编译,提示:The method vary2(int...) in the type VariousPara
  17.                                          //is not applicable for the arguments (int[], int)
  18.         }
复制代码



评分

参与人数 1技术分 +1 收起 理由
乔兵 + 1

查看全部评分

10 个回复

倒序浏览
int... nums
这句话的意思是:你可以传一个或多个int类型的整数
回复 使用道具 举报
浮出一个美 发表于 2014-1-2 15:59
int... nums
这句话的意思是:你可以传一个或多个int类型的整数

为什么当参数是T... nums时可以通过?
回复 使用道具 举报
任亚俊 发表于 2014-1-2 16:47
为什么当参数是T... nums时可以通过?

如果我没有记错,T是一种泛型,相当于Object,是所有类的父类
回复 使用道具 举报
vary1(T... nums) 引用数据类型的可变参数
vary2(int... nums) 基本数据类型int的可变参数

int[] arr={2,3};
vary2(arr,1)  arr代表的是数组,数组是引用数据类型。     1是int基本数据类型。
你想基本数据类型的可变参数中传递了引用数据类型。
回复 使用道具 举报
  1. private <T> void vary1(T... nums){
  2.                
  3.         }
  4.         @Test
  5.         public void testVary1() {
  6.                 int[] arr={2,3};
  7.                 vary1(arr,1);//可以通过编译,因为T表示泛型,可以传任意类型参数
  8.         }
  9.         
  10.         private void vary2(int... nums){
  11.                
  12.         }
  13.         @Test
  14.         public void testVary2() {
  15.                 int[] arr={2,3};
  16.                 vary2(arr,1);//不可以通过编译,因为限定了参数为int...nums,arr为数组,当然提示参数不匹配了
  17.         }
复制代码
回复 使用道具 举报
其LovE斤 发表于 2014-1-2 20:14
vary1(T... nums) 引用数据类型的可变参数
vary2(int... nums) 基本数据类型int的可变参数

哦哦,原来数组是引用类型参数。
回复 使用道具 举报
数组可以new  在堆内存中开辟空间。
Person   p = new Person();
int[]   i = new int[1];
是一样的。
回复 使用道具 举报
其LovE斤 发表于 2014-1-2 20:49
数组可以new  在堆内存中开辟空间。
Person   p = new Person();
int[]   i = new int[1];

恩恩,张见识了。
回复 使用道具 举报
任亚俊 发表于 2014-1-2 20:38
哦哦,原来数组是引用类型参数。

数组可以new  在堆内存中开辟空间。
Person   p = new Person();
int[]   i = new int[1];
是一样的。
在栈内存中的i  存的只是 new出来的堆内存的地址
回复 使用道具 举报


  1. private <T> void vary1(T... nums){
  2.         
  3.     }

  4.     public void testVary1() {
  5.             int[] arr={2,3};
  6.             vary1(arr,1);//可以通过编译
  7.     }
  8.    
  9.     private void vary2(Object... nums){   //改为Object就可以通过编译
  10.             
  11.     }

  12.     public void testVary2() {
  13.             int[] arr={2,3};
  14.             vary2(arr,1);//不可以通过编译,提示:The method vary2(int...) in the type VariousPara
  15.                                      //is not applicable for the arguments (int[], int)
  16.     }
复制代码

先解答为什么改为Object就可以通过编译,因为int[]与int都可以转化为他们的父类Object类型,所以只要是他们的子类作为参数就可以

而你的参数int[]的类型在JVM中表示为"[I",即就是int类型的数组,而另一个参数为int类型,他们的父集是Object类型,而vary2函数定义需要的类型是int类型,不能将Object类型转化为int类型,所以编译器报错。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马