Java 5 泛型与注解
2026/1/15大约 2 分钟JavaJava版本特性泛型注解JavaJava新特性LambdaStreamOptional模块化虚拟线程
概述
Java 5(2004年9月)是 Java 历史上最重要的版本之一,引入了大量新特性,极大地提升了开发效率和代码质量。
泛型 (Generics)
泛型允许在编译时进行类型检查,避免运行时的 ClassCastException。
基本用法
// Java 5 之前
List list = new ArrayList();
list.add("hello");
String s = (String) list.get(0); // 需要强制转换
// Java 5 之后
List<String> list = new ArrayList<String>();
list.add("hello");
String s = list.get(0); // 无需强制转换泛型类
public class Box<T> {
private T content;
public void set(T content) {
this.content = content;
}
public T get() {
return content;
}
}
// 使用
Box<String> stringBox = new Box<>();
stringBox.set("Hello");泛型方法
public static <T> T getFirst(List<T> list) {
return list.isEmpty() ? null : list.get(0);
}通配符
// 上界通配符 - 只读
public void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
}
// 下界通配符 - 只写
public void addIntegers(List<? super Integer> list) {
list.add(1);
list.add(2);
}注解 (Annotations)
注解为代码提供元数据,可用于编译检查、代码生成、运行时处理等。
内置注解
@Override // 标记重写方法
public String toString() {
return "MyClass";
}
@Deprecated // 标记已过时
public void oldMethod() {}
@SuppressWarnings("unchecked") // 抑制警告
public void suppressWarning() {}自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value() default "";
int count() default 0;
}
// 使用
@MyAnnotation(value = "test", count = 5)
public void myMethod() {}增强 for 循环
// Java 5 之前
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// Java 5 之后
for (String item : list) {
System.out.println(item);
}自动装箱/拆箱
// 自动装箱
Integer num = 100; // 等价于 Integer.valueOf(100)
// 自动拆箱
int n = num; // 等价于 num.intValue()
// 注意:可能导致 NullPointerException
Integer nullNum = null;
int value = nullNum; // 抛出 NPE枚举 (Enum)
public enum Season {
SPRING("春天"),
SUMMER("夏天"),
AUTUMN("秋天"),
WINTER("冬天");
private final String chinese;
Season(String chinese) {
this.chinese = chinese;
}
public String getChinese() {
return chinese;
}
}
// 使用
Season season = Season.SPRING;
switch (season) {
case SPRING -> System.out.println("春暖花开");
case SUMMER -> System.out.println("烈日炎炎");
}可变参数 (Varargs)
public void printAll(String... args) {
for (String arg : args) {
System.out.println(arg);
}
}
// 调用
printAll("a", "b", "c");
printAll("single");静态导入
import static java.lang.Math.*;
import static java.lang.System.out;
public class StaticImportDemo {
public void demo() {
out.println(sqrt(4)); // 直接使用,无需 Math.sqrt
out.println(PI); // 直接使用,无需 Math.PI
}
}并发工具包 (java.util.concurrent)
// 线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
executor.submit(() -> System.out.println("Task executed"));
// 并发集合
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
// 原子类
AtomicInteger counter = new AtomicInteger(0);
counter.incrementAndGet();
// 锁
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 临界区代码
} finally {
lock.unlock();
}总结
Java 5 的新特性对比:
| 特性 | 作用 |
|---|---|
| 泛型 | 类型安全,减少强制转换 |
| 注解 | 元数据支持,简化配置 |
| 枚举 | 类型安全的常量 |
| 增强for | 简化集合遍历 |
| 自动装箱 | 简化基本类型与包装类转换 |
| 可变参数 | 灵活的方法参数 |
| 并发包 | 强大的并发编程支持 |
Java 5 是 Java 语言现代化的起点,这些特性至今仍是 Java 开发的核心基础。
