java遗珠之@SafeVarargs
Posted 吴冬冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java遗珠之@SafeVarargs相关的知识,希望对你有一定的参考价值。
当使用泛型作为可变参数时,因为可变参数是数组类型,在编译之后泛型会被擦出掉,那么传入参数就成了unchecked的警告:
如下例子
public class VarargsWaring
private static List<String> useVarargs(List<String>... args)
return args.length > 0 ? args[0] : null;
public static void main(String[] args)
List<String> list = new ArrayList<>();
System.out.println(VarargsWaring.useVarargs(list));
像我们开始讲的那样,类型是会经过擦除,如果代码改成
public class VarargsWaring
private static List<String> useVarargs(List<String>... args)
return args.length > 0 ? args[0] : null;
public static void main(String[] args)
List list = new ArrayList<Integer>();
System.out.println(VarargsWaring.useVarargs(list));
依然可以编译通过,如果方法里进一步对String进行操作,那么就会报运行时异常。
在此编译器给出警告,如果你非常确认你所有的调用都没有类型未检查的错误,那么你可以使用SafeVarargs
来忽略此警告
public class VarargsWaring
@SafeVarargs
private static List<String> useVarargs(List<String>... args)
return args.length > 0 ? args[0] : null;
public static void main(String[] args)
List list = new ArrayList<String>();
System.out.println(VarargsWaring.useVarargs(list));
还要注意几点:
- 必须是可变参数方法和构造器
- 如果是可变参数的方法,那么必须是static和final的
以上是关于java遗珠之@SafeVarargs的主要内容,如果未能解决你的问题,请参考以下文章