可变参数总结(二)

关于泛型的问题

    我从网上看到的一个例子说是Arrays这个工具类里面有个静态方法asList(T … a)

int[] is=...//自定义的数组,或者从什么地方获取来的数组

List<Integer> list=Arrays.asList(is);Ecilipse出错提示:类型不匹配,不能将List<int[]>转化成List<Integer>,我又试了试char也是不行的,就是8种基本类型是不可以的,但是他们的包装类是可以的,数组可以正常转成想要的list的。因为int是原始类型,不是Object的子类.而泛型T隐含的条件是T extends Object.所以编译器不会把每一个int看做T,不会把

 

int[]看做T点点点.虽然java已经支持自动将原始类型封包成外包类,但那是单个的情况.

而数组(不管什么类型)则是一种特殊的类型,Object的子类,所以编译器觉得整个int[]对应一个T,你调用的方法是asList<int[]>(int[]... args)而不是你想象中asList<Integer>(Integer...)

 

Jdk1.5使用可变参数的例子

java5中还有些使用可变参数的例子,比如java.lang.reflect.Method 类的invoke方法,比如getMethod方法。这些都能够在实际运用当中简化我们写的代码,提高效率。

举个例子,假如没有可变参数的话,要实现下面例子中功能需要如下几个步骤:

需求是要求动态的加载一个类并执行他某个特殊的方法进行操作。

public class MainTest {

    @SuppressWarnings("all")

    public static void main(String[] args) throws Exception {

       // 构造获取方法参数的数组

       Class[] argTypes = { String.class, int.class };

       // 构造执行方法的参数

       Object[] methodData = { "A", new Integer(20) };

       Class c = Class.forName ("com.lion.varargs.SomeClass");

       Method m = c.getMethod ("someMethod", argTypes);

       m.invoke (c.newInstance (), methodData);

    }

}

 

class SomeClass {

    public void someMethod(String strArg, int intArg) {

       System.out.println("strArg = " + strArg);

       System.out.println("intArg = " + intArg);

    }

}

 

如何使用可变参数的话,可以省略两步构造参数的过程。例子程序见下:

 

public class MainTest {

    @SuppressWarnings("all")

    public static void main(String[] args) throws Exception {

       Class c = Class.forName ("com.lion.varargs.SomeClass");

       Method m = c.getMethod ("someMethod", String.class, int.class);

       m.invoke (c.newInstance (), "A", 20);

    }

}

 

class SomeClass {

    public void someMethod(String strArg, int intArg) {

       System.out.println("strArg = " + strArg);

       System.out.println("intArg = " + intArg);

    }

}

 

执行的效果和第一个程序一样,但是代码减少了些,上面的两个程序只是做演示用的,具体的工程中代码还是应该像第一程序那样,比较清晰明了。

你可能感兴趣的:(C++,c,C#)