java变参

java变参是通过数组来实现的

Object[] addAll(Object[] array1, Object... array2)和Object[] addAll(Object[] array1, Object[] array2)签名应该一致的。
public class ArrayUtils {
    // Clone
    // -----------------------------------------------------------------------
    /**
     * <p>
     * Shallow clones an array returning a typecast result and handling <code>null</code>.
     * </p>
     *
     * <p>
     * The objects in the array are not cloned, thus there is no special handling for multi-dimensional arrays.
     * </p>
     *
     * <p>
     * This method returns <code>null</code> for a <code>null</code> input array.
     * </p>
     *
     * @param array
     *            the array to shallow clone, may be <code>null</code>
     * @return the cloned array, <code>null</code> if <code>null</code> input
     */
    public static Object[] clone(Object[] array) {
        if (array == null) {
            return null;
        }
        return array.clone();
    }

/**
     * <p>
     * Adds all the elements of the given arrays into a new array.
     * </p>
     * <p>
     * The new array contains all of the element of <code>array1</code> followed by all of the elements <code>array2</code>.
     * When an array is returned, it is always a new array.
     * </p>
     *
     * <pre>
     * ArrayUtils.addAll(null, null)     = null
     * ArrayUtils.addAll(array1, null)   = cloned copy of array1
     * ArrayUtils.addAll(null, array2)   = cloned copy of array2
     * ArrayUtils.addAll([], [])         = []
     * ArrayUtils.addAll([null], [null]) = [null, null]
     * ArrayUtils.addAll(["a", "b", "c"], ["1", "2", "3"]) = ["a", "b", "c", "1", "2", "3"]
     * </pre>
     *
     * @param array1
     *            the first array whose elements are added to the new array, may be <code>null</code>
     * @param array2
     *            the second array whose elements are added to the new array, may be <code>null</code>
     * @return The new array, <code>null</code> if <code>null</code> array inputs. The type of the new array is the type of the
     *         first array.
     * @since 2.1
     */
    public static Object[] addAll(Object[] array1, Object... array2) {
        if (array1 == null) {
            return clone(array2);
        } else if (array2 == null) {
            return clone(array1);
        }
        Object[] joinedArray = (Object[]) Array
                .newInstance(array1.getClass().getComponentType(), array1.length + array2.length);
        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
        return joinedArray;
    }
    /**
     * Swaps the two specified elements in the specified array.
     *
     * @param arr
     * @param i
     * @param j
     */

    public static void swap(Object[] arr, int i, int j) {
        Object tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

测试变参

 public static void main(String[] args) {
        String[] array = { "22", "66" };
        // The argument of type String[] should explicitly be cast to Object[] for the invocation of the varargs method
        // addAll(Object[], Object...) from type ArrayUtils. It could alternatively be cast to Object for a varargs invocation
        System.out.println(Arrays.toString(ArrayUtils.addAll(array, new String[] { "2", "6" }))); // Compile warning
        System.out.println(Arrays.toString(ArrayUtils.addAll(array, "2", "6"))); // OK
        System.out.println(Arrays.toString(ArrayUtils.addAll(array, (Object[]) new String[] { "2", "6" }))); // OK
        System.out.println(Arrays.toString(ArrayUtils.addAll(array, (Object) new String[] { "2", "6" })));// java.lang.ArrayStoreException
    }

自动包装

Object[] addAll(Object[] array1, Object... array2)
--> 传参:Object[] addAll(Object[] array1, Object array2_0, Object array2_1, Object array2_2, ...)
--> 变长参数包装:Object[] array2 = new Object[]{array2_0, array2_1, array2_2};
--> 编译后实际的:Object[] addAll(Object[] array1, Object[] array2)

由于实际函数是Object[] addAll(Object[] array1, Object[] array2),则在变长参数位置直接传递数组时,编译器给出警告。

  • 默认的数组直接作为实际函数Object[] addAll(Object[] array1, Object[] array2)的第二参数,
  • 消除警告可以添加强制转换,规定是(Object[])和默认方式相同;(Object)则作为变长参数的一项,自动包装为new Object[]{(Object) new String[] { "2", "6" }},变成了二维数组,String型数组不能存储元素String[]的对象(String[] joinedArray; joinedArray[0] = new String[] { "2", "6" }是不正确的),则在第二个System.arraycopy发生存储异常

另外的消除编译警告还可以这样,通过泛型:

    public static <T> Object[] addAll(Object[] array1, T... array2) {
        if (array1 == null) {
            return clone(array2);
        } else if (array2 == null) {
            return clone(array1);
        }
        Object[] joinedArray = (Object[]) Array
                .newInstance(array1.getClass().getComponentType(), array1.length + array2.length);
        System.arraycopy(array1, 0, joinedArray, 0, array1.length);
        System.arraycopy(array2, 0, joinedArray, array1.length, array2.length);
        return joinedArray;
    }

缺点是编译时如果array2类型不是全部一样,会被检查,如

String[] array = { "22", "66" };

System.out.println(Arrays.toString(ArrayUtils.addAll(array, new Object[] { "2", "6", 2 })));
System.out.println(Arrays.toString(ArrayUtils.addAll(array, "2", "6", 2))); 

继续执行,只会得到java.lang.ArrayStoreException。除非第一参数是Object[] array = { "22", "66" };才能即能存储String又能存储Integer(上面的2)

时间: 2024-10-27 19:19:32

java变参的相关文章

Java变参、C/C++/Objective_C变参

/* java中变参方法,变参即参数列表不固定,但是参数类型是一样的,在使用时,形参变量是数组类型的引用 */ public class AppEnter{ public static void main(String[] args) throws Exception{ AppEnter.unfixedArguments("one", "two", "three"); AppEnter.unfixedArguments(100, "on

Java 变参函数的实现

Java的变参函数实现实际上参数是一个数组,其简单用法如下 public class variableParamTest { private static void variableParam(Object... args) { for (Object v : args) { System.out.print(v.toString() + " "); } System.out.println(); } private static void variableParam2(int a,

java 16 - 13 可变参数和Arrays工具类的asList()方法

可变参数:定义方法的时候不知道该定义多少个参数 格式: 修饰符 返回值类型 方法名(数据类型… 变量名){ } 注意: 这里的变量其实是一个数组 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个 1 import java.util.Scanner; 2 public class ArgsDemo { 3 4 public static void main(String[] args) { 5 int result = sum(1,2,3,4,5,6,7,8,9);//参与计

数据结构复习之n维数组实现(可变参数表的使用)

首先先介绍一下可变参数表需要用到的宏: 头文件:#include<cstdarg> void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); va_list:用来保存宏va_start.va_arg和va_end所需信息的一种类型.为了访问变长参数列表中的参数,必须声明             va_list类型的一个对象

你应该更新的Java知识之常用程序库【转载】

在很多人眼中,Java 已经是一门垂垂老矣的语言,但并不妨碍 Java 世界依然在前进.如果你曾离开 Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老 Java 中的新东西. Guava Guava[gwɑ:v?],一句话,只要你做Java项目,就应该用Guava. guava 是 Google 出品的一套 Java 核心库,在我看来,它甚至应该是 JDK 的一部分.作为一个 Java 程序员,如果你没抱怨过JDK的设计,只能说明一点,你写得程序还是太少.正是JDK

步步理解 JAVA 泛型编程

步步理解 JAVA 泛型编程 转载自: 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(一) 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(二) 隔叶黄莺 Unmi Blog------步步理解 JAVA 泛型编程(三) 步步理解 JAVA 泛型编程(一) JDK 1.5 相对于 JDK 1.4 来说变化最大的部分就是泛型,甚至可以说自 Java 1.0 发布以来也是最大的一次语言变化,因为要涉及到编译器的大改动.很早的时候大家对泛型的呼声很大,正如

java程序设计基础篇 复习笔记 第三单元

1 单向if语句 双向if语句 dangling else switch:char,byte,short,int 2 javax.swing.JOptionPane.showConfirmDialog(null,text); 返回值: JOptionPane.YES_OPTION:0 JOptionPane.NO_OPTION:1 JOptionPane.CANCEL_OPTION:2 3 cannot cast int from boolean cannot cast boolean from

《Java程序员修炼之道》

原子类:java.util.concurrent.atomic 线程锁:java.util.concurrent.locks 对付死锁:boolean acquired = lock.tryLock(wait,TimeUtils.MILLISECONDS); CountDownLatch锁存器:让线程在同步前做准备工作. CopyOnWriteArrayList BlockingQueue<LsxUnit<MyClass>> 控制执行: 任务:Callable, Future, F

[shyのJAVA初探]hdu1166●树状数组

一开始shy是为了大数而走近java,随后情不自禁地就希望能初步了解java的语言特点. java初学对c++选手而言可谓简单非常.因为java的语法和c++的语法简直一样(虽然这话不太严谨,容易遭到很多反驳,不过,,shy实在是没有见过如此相像的两种语言).比如,①java开变量的方式是:int x;char c;boolean b;②java的for循环:for(int i=1;i<=n;i++){}③java的条件语句:if(--cas>0&&str!="end