JAVA可变参数方法及它的重载

JAVA支持方法的可变参数。类似如下

public void method1(String... arg1);

 这样,调用method1时候,参数的数量是可变的,如method1("1","2","3")。注意可变参数只能是最后一个参数。

JAVA内部是把这样的参数看成一个数组来处理。在获取多个参数的时候可以用数组遍历来完成。

for (String temp : arg1) {
      System.out.println("one of the arguments is " + temp);
}

 可能有人会说,这样的循环遍历像List那样的集合也可以,凭什么说是数组。那好,再看下面代码:

public void method1(String... arg1);
public void method1(String[] arg1);

 这样的重载,在编译时候会报错,JAVA不允许这样的重载,其实理由很简单,String... 和String[]对编译器来说是一样的。参数一样自然无法重载。

 

下面讲可变参数方法的重载:

 

	public void method1(String... arg1) {
	}
	
	public void method1(String a, String... arg1) {
	}

 我在eclipse中测试,IDE并没有提示错误。但是在实例后调用就不行了,IDE报“The method method1(String[]) is ambiguous for the type ...”,大致是说这个方法有混淆,无法正确的调用。话说类编译的时候没问题,到实例后调用就会提示错误。

 

 

        public void method1(String... arg1) {
		System.out.println("1");
	}
	
	public void method1(String a, String b) {
		System.out.println("2");
	}

 上述是完全可以的,但是如果方法被调用是输入的参数是2个的时候,到底上面哪个会被调用呢。答案是参数固定那个。能匹配定长的方法,那么优先匹配该方法。含有不定参数的那个重载方法是最后被选中的。

 

 

之前对可变参数方法及这种方法的重载也就个模糊的影像,在开发中偶尔用下,昨天遇到了个奇怪的问题。

定义了两个方法:

protected List executeQueryMultiplyResult(String sql, Object... params);
protected List executeQueryMultiplyResult(String sql, Class<T> arg, Object... params);

 一开始很正常,比如executeQueryMultiplyResult("sql", a.class, new Object[]),这种调用能正确的调用上述的第二种。昨天,因为设计的需要,把这两个方法pull up到了父类中去。结果就有了问题,有些能正确调用,有些却不能。如果都不能,也就当时编译器无法正确区分这两个。网上差了好多可变参数方法的重载问题,我都没有犯那些错误。调试了半天,后来发现在IDE代码只能不全的时候提示第二种方法的第二个参数是固定的。自己研究了下代码,原来Class<T> arg中的T是泛型,子类在继承父类时指定了这个泛型。所以这边,实际arg参数实际已经固定了。如果子类的T是类a,那么如果传a.class,就会选择第二个方法,如果传入了其他,如b.class,就变了第一种方法,Object也是包含了Class的。唉,滥用泛型导致的错误啊。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值