泛型数组 @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:如何避免类型转换异常?的详细内容,更多请关注其它相关文章!