
泛型数组 @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免费学习笔记(深入)”;
文心大模型
百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作
56 查看详情
解决方案:
为了解决这个问题,需要修改 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 类创建一个列表,再把列表转换为数组。这种做法可以确保创建的数组类型与传入的参数类型一致。
以上就是Java泛型数组与@SafeVarargs:如何避免类型转换异常?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/381107.html
微信扫一扫
支付宝扫一扫