
泛型数组 @safevarargs:如何正确使用?
在 java 中,泛型数组的使用需要特别注意 @safevarargs 注解。当我们在方法中使用 @safevarargs 标注可变参数时,表明该方法将接受不定数量的同类型参数,且可以使用它来创建该类型的数组。然而,在使用时,仍然存在一些需要注意的地方。
问题示例:
import java.util.arrays;
public class main {
public static void main(string[] args) {
string[] arr = asarray("one", "two", "three");
system.out.println(arrays.tostring(arr));
string[] firsttwo = picktwo("one", "two", "three");
system.out.println(arrays.tostring(firsttwo));
}
static k[] picktwo(k k1, k k2, k k3) {
return asarray(k1, k2);
}
@safevarargs
static t[] asarray(t... objs) {
return objs;
}
} 这段代码出现了一个错误:在调用 picktwo 方法时,会抛出 class [ljava.lang.object; cannot be cast to class [ljava.lang.string; 异常。这是因为 picktwo 方法声明返回类型为泛型数组 k[],而 asarray 方法中创建的是 t[] 数组。
立即学习“Java免费学习笔记(深入)”;
解决方案:
为了解决这个问题,需要修改 asarray 方法,使其返回与传入参数类型一致的数组,并使用 list 辅助类来正确创建数组。修改后的代码如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List arr = asList("one", "two", "three");
System.out.println(arr);
List firstTwo = pickTwo("one", "two", "three");
System.out.println(firstTwo);
}
static List pickTwo(K k1, K k2, K k3) {
return asList(k1, k2);
}
@SafeVarargs
static List asList(T... objs) {
return new ArrayList<>(Arrays.asList(objs));
}
} 在修改后的代码中,asarray 方法不再直接返回一个数组,而是使用 arraylist 类创建一个列表,再把列表转换为数组。这种做法可以确保创建的数组类型与传入的参数类型一致。










