java 1.5中引入的一个特性(允许在方法声明中使用可变长度的参数)。一个方法的最后一个形式参数可以被指定为代表任意多个相同类型的参数。在调用的时候, 这些参数是以数组的形式传递的。在方法体重也可以按照数组的方式来引用这些参数。

@SafeVarargs

不过一般不常见,java.util.Arrays等源码中可以看到。

  • 变长参数方法的示例
public int sum(int... args) {  
    int result = 0;  
    for (int value : args) {  
        result += value;  
    }  
    return result;  
} 

可变长度的参数在实际开发中可以简化方法的调用方式。但是在Java 7之前,如果可变长度的参数与泛型一起使用会遇到一个麻烦,就是编译器产生的警告过多。

  • 使用泛型的变长参数方法产生编译器警告的示例
public static <T> T useVarargs(T... args) {  
    return args.length > 0 ? args[0] : null;  
} 

如果参数传递的是不可具体化(non-reifiable)的类型,如List这样的泛型类型,会产生警告信息。每一次调用该方法,都会产生警告信息。 比如在Java 7之前的编译器上编译代码清单1-23中的代码,编译器会给出警告信息。如果希望禁止这个警告信息, 需要使用@SuppressWarnings("unchecked")注解来声明。

如果开发人员确信某个使用了可变长度参数的方法,在与泛型类一起使用时不会出现类型安全问题,就可以用@SafeVarargs注解进行声明。

@SafeVarargs  
public static <T> T useVarargs(T... args) {  
    return args.length > 0 ? args[0] : null;  
} 

注:@SafeVarargs注解只能用在参数长度可变的方法或构造方法上,且方法必须声明为static或final,否则会出现编译错误。 一个方法使用@SafeVarargs注解的前提是,开发人员必须确保这个方法的实现中对泛型类型参数的处理不会引发类型安全问题。 ⤧  Next post 多线程内置锁与互斥锁 ⤧  Previous post JDK中设计模式