Java 泛型(Generics)自 Java 5 引入,用于提供编译期类型安全和代码复用。下面从设计、使用、性能、常见陷阱四个维度总结Java 泛型最佳实践。
Object❌ 不推荐
List list = new ArrayList();
list.add("abc");
String s = (String) list.get(0);
✅ 推荐
List<String> list = new ArrayList<>();
list.add("abc");
String s = list.get(0);
好处:编译期检查,避免 ClassCastException
常见约定:
T:TypeE:Element(集合)K:KeyV:ValueN:NumberR:Result✅ 推荐
public interface Repository<K, V> {
V find(K key);
}
当泛型需要约束能力时,使用 extends
✅ 推荐
public <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) > 0 ? a : b;
}
❌ 避免无限制泛型(除非真的需要)
public <T> void process(T t) { } // 通常意义不大
如果只有某个方法需要泛型,不要污染整个类
✅ 推荐
public class Utils {
public static <T> T getFirst(List<T> list) {
return list.get(0);
}
}
<? extends T>(Producer)和 <? super T>(Consumer)遵循 PECS 原则(Producer Extends, Consumer Super)
✅ 读取(Producer)
void read(List<? extends Number> list) {
Number n = list.get(0);
}
✅ 写入(Consumer)
void write(List<? super Integer> list) {
list.add(1);
}
❌ 禁止
List list = new ArrayList();
✅ 明确类型
List<String> list = new ArrayList<>();
<>(Java 7+)✅ 推荐
List<String> list = new ArrayList<>();
❌ 暴露
public Map<String, List<User>> getUserMap() {
return new HashMap<>();
}
✅ 封装(可选)
public UserRepository getUserRepository() {
return new UserRepository();
}
List<String> → List⚠️ 不能做:
if (obj instanceof List<String>) // 编译错误
✅ 正确
if (obj instanceof List) {
List<?> list = (List<?>) obj;
}
❌ 错误示例
T[] array = new T[10]; // 编译错误
✅ 替代方案
List<T> list = new ArrayList<>();
或
@SuppressWarnings("unchecked")
T[] array = (T[]) new Object[10];
<?>❌ 错误
List<?> list = new ArrayList<String>();
list.add("x"); // 编译错误
✅ 明确边界
List<? super String> list = new ArrayList<>();
list.add("x");
❌ 错误
class Box<T> {
static T value; // 编译错误
}
✅ 使用泛型方法
static <T> T getValue() { ... }
❌ 错误
class MyException<T> extends Exception { } // 不允许
| 场景 | 最佳实践 |
|---|---|
| 集合 | 始终指定泛型 |
| 方法 | 能用泛型方法就不要用泛型类 |
| 读取 | ? extends T |
| 写入 | ? super T |
| 约束 | T extends XXX |
| 数组 | 避免泛型数组 |
| 类型 | 避免使用 Raw Type |
如果你愿意,我也可以:
你更想看哪一块?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。