java泛型通过尖括号声明类型参数,在编译期进行类型检查,禁止非法操作;泛型类与方法分别在类名后和返回类型前声明类型变量,支持有界类型、多参数关联及通配符?。

Java 泛型用尖括号 `List<string></string> 里加一个 Integer,或者从 Map<k v></k> 里取值后不加转换直接当 Date 用。
在类中声明泛型:让整个类适配多种类型
泛型类通过在类名后加 `
- 用具体类型初始化,避免原始类型:
List<string> list = new ArrayList();</string>—— 编译器立刻阻止你调用list.add(123) - 支持有界类型,限制可传入范围:
class Box<t extends number> { T value; }</t>,这样Box<string></string>直接编译失败,Box<double></double>才合法 - 字段、构造器、方法都共享同一个类型参数:
private T data;、public void set(T data) { this.data = data; },取值时自动是T类型,不用(T)obj
在方法中声明泛型:局部类型推断与契约约束
泛型方法把 `
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 基础写法:
public static <t> T getFirst(List<t> list) { return list.get(0); }</t></t>,调用时getFirst(names)返回String,getFirst(numbers)返回Integer,无需转型 - 带边界的泛型方法更安全:
public static <t extends comparable>> T max(List<t> items) {...}</t></t>,传入List<string></string>没问题,List<object></object>就过不了编译 - 多参数类型可关联:
public static <k v> boolean containsKey(Map<k v> map, K key)</k></k>,确保 key 类型和 map 声明的键类型一致,不会出现map.containsKey("abc")却报错的情况
尖括号里的常见写法与实际含义
`
-
T表示 Type(如class Stack<t></t>),E表示 Element(ArrayList<e></e>),K/V表示 Key/Value(HashMap<k v></k>) -
?是通配符,不是类型变量:List extends Number>表示“某个 Number 的子类型”,只能读不能 add(除null);List super Integer>表示“Integer 的某个父类型”,可以 addInteger,但 get 出来只能当Object - 不能用基本类型:
List<int></int>是非法的,必须写List<integer></integer>;数组类型也不能直接泛型化,List<int></int>合法,但List<int></int>也合法,只是元素类型是int[][]
为什么编译期就能拦错?因为类型擦除不是“没检查”
泛型信息确实会在字节码里被擦除(比如 ArrayList<string></string> 运行时就是 ArrayList),但这不等于没用。擦除前,编译器已完成全部校验:插入、获取、赋值、方法调用……所有涉及泛型的地方都被逐条比对。擦除只是为兼容老代码做的妥协,不是放弃安全。
- 错误写法当场报红:
Map<string integer> m = new HashMap();</string>(没写尖括号)→ 警告;m.put("a", "not int");→ 编译错误 - 正确写法自动补全类型:
Stream.of("x", "y").map(String::length),编译器推导出Stream<string></string>和Stream<integer></integer>,中间不需任何 cast - 泛型异常不是运行时才爆:
List<string> l = new ArrayList(); l.add(1); String s = l.get(0);</string>—— 第二行就编译失败,根本到不了第三行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










