注解unchecked的原因_Java堆污染(Heap Pollution), 注解@SafeVarargs的作用

本文详细解释了Java中的堆污染(Heap Pollution)现象,特别是在泛型和可变参数方法中出现的情况。堆污染可能导致ClassCastException。通过示例展示了如何通过@SafeVarargs注解消除编译器的警告,确保方法不会引发ClassCastException。
摘要由CSDN通过智能技术生成

Heap Pollution

首先来看下什么是Heap Pollution(堆污染)。

在Java编程语言中, 当一个 可变泛型参数 指向一个 无泛型参数 时,堆污染(Heap Pollution)就有可能发生。

举例一:

创建一个方法,空实现即可,如下所示

public static void varagMethod(Set objects) {

}

此方法接受的是一个泛型为Integer类型的Set集合,假如我们将一个没有泛型的Set对象传给此方法时,则有可能造成堆污染,如下所示

public static void main(String[] args) {

Set set = new TreeSet();

set.add("abc");

varagMethod(set);

}

以上代码,我们将一个无泛型的Set传递给了varagMethod方法,此时就有可能造成堆污染。当发生这种情况时,编译器可以检测到,并给我们Warning,如下

而Heap Pollution有可能导致更严重的后果 : ClassCastException, 我们在刚才的varagMethod方法中添加几行代码如下:

public static void varagMethod(Set objects) {

objects.add(new Integer(10));

}

然后修改下main方法

public static void main(String[] args) {

Set set = new TreeSet();

varagMethod(set);

Iterator iter = set.iterator();

while (iter.hasNext()) {

String str = iter.next(); // ClassCastException thrown

System.out.println(str);

}

}

然后重新运行一下,程序直接 Crash!!!

可以看到,程序报了一个ClassCastException(类型转换错误),这是因为Java允许

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值