海印网
海印网

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

admin数码00

Java泛型数组与@SafeVarargs:如何避免类型转换异常?-第1张图片-海印网

泛型数组 @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> k[] picktwo(k k1, k k2, k k3) {
        return asarray(k1, k2);
    }

    @safevarargs
    static <t> 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<String> arr = asList("one", "two", "three");
        System.out.println(arr);
        List<String> firstTwo = pickTwo("one", "two", "three");
        System.out.println(firstTwo);
    }

    static <K> List<K> pickTwo(K k1, K k2, K k3) {
        return asList(k1, k2);
    }

    @SafeVarargs
    static <T> List<T> asList(T... objs) {
        return new ArrayList<>(Arrays.asList(objs));
    }
}

登录后复制

在修改后的代码中,asarray 方法不再直接返回一个数组,而是使用 arraylist 类创建一个列表,再把列表转换为数组。这种做法可以确保创建的数组类型与传入的参数类型一致。

以上就是Java泛型数组与@SafeVarargs:如何避免类型转换异常?的详细内容,更多请关注其它相关文章!

Tags: 数组类型

Sorry, comments are temporarily closed!