Java泛型数组与@SafeVarargs注解:如何避免类型转换异常?

泛型数组 @safevarargs 的应用

在 java 中,@safevarargs 注解用于确保 varargs 参数的安全访问。您想使用它来创建泛型数组,但遇到了错误。让我们深入了解@safevarargs 的工作原理以及如何正确使用它。

@safevarargs 通过检查 varargs 参数是否与您声明的数组类型兼容来保证安全性。然而,在给定的代码中:@safevarargs 注解应用于 asarray 方法,但错误发生在 picktwo 方法中。问题在于这两个方法都返回数组,但它们的类型不同。

asarray 方法声明为 t[] asarray(t... objs),返回一个泛型数组,其中 t 是实际的类型参数。另一方面,picktwo 方法声明为 k[] picktwo(k k1, k k2, k k3),返回一个泛型数组,其中 k 是一个占位符类型变量。

因此,编译器不能推断出 asarray 中声明的 t 类型与 picktwo 中声明的 k 类型相同。这就导致了类转换异常,将 picktwo 方法返回的 object 数组强制转换为 string 数组。

为了解决这个问题,需要将两种方法的返回值类型保持一致。您可以通过将 aslist 用作返回值来实现这一点,因为 list 是一个通用的接口,可以存储

任何类型的元素。

更新后的代码如下:

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 Arrays.asList(objs);
    }
}