@SafeVarargs

public static void main(String[] args) {
    test(1, 2);
    test(1, 2L);
}

//@SafeVarargs
public static <T> void test(T... array) { // Warning: Possible heap pollution from parameterized vararg type
    for (T arg : array) {
        System.out.println(arg.getClass().getSimpleName() + " : " + arg);
    }
}
原因

可变参数为泛型类型时,编译器发出的警告。若方法内部进行类型转换,可能会发生ClassCastException。

解释

这样会导致原本认为同一类型的多个可变参数,会出现类型不同的情况。比如测试代码中同时传递了Integer & Long不同类型的参数,那么编译器会进行类型推断,若二者都具有相同的抽象元素,则编译通过,否则编译失败。Integer & Long都为Number的子元素,故编译成功。

解决方式
  1. 方法上添加@SafeVarargs注解,表明开发者告诉编译器:可变参数为泛型类型时,内部不会发生类型转换异常。
  2. 将可变参数转为 T[] 的形式,这样类型一致的问题是调用时就处理好的。即使传递了类似这样的参数:new Object[] {1, “A”} 内部依旧有可能会发生转换异常,但这是在开发者知晓的情况下发生的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值