基本 Annotation

来自姬鸿昌的知识库
Jihongchang讨论 | 贡献2024年7月10日 (三) 10:02的版本 →‎“堆污染”示例
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

@Override 限定重写父类方法

@Deprecated 标示已过时

@SuppressWarnings 抑制编译器警告

@SafeVarargs 抑制“堆污染”警告

“堆污染”示例

import java.util.ArrayList;
import java.util.List;

public class Test3 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List list = new ArrayList<Integer>();
		
		/*
		 * Type safety: The method add(Object) belongs to the raw type List. 
		 * References to generic type List<E> should be parameterized
		 */
		list.add(20);
		
		//把一个不带泛型的对象赋给一个带泛型的变量
		List<String> ls = list;
		
		//只要访问 ls 里的元素,如下面代码就会引起运行时异常
		System.out.println(ls.get(0));
	}

}
Exception in thread "main" java.lang.ClassCastException: class java.lang.Integer cannot be cast to class java.lang.String (java.lang.Integer and java.lang.String are in module java.base of loader 'bootstrap')
	at zj.Test3.main(Test3.java:24)

Java 把引发这种错误的原因成为“堆污染”(Heap pollution)。

从 Java 7 开始,Java 编译器将会进行更严格的检查以避免发生可能的“堆污染”,但有些时候,开发者不希望看到这个警告,就可以使用 @SafeVarargs 修饰引发该警告的方法或构造器。