在 Java 中,声明一个泛型类如:
public class Result<T> implements Serializable {
// ...
}
是定义阶段的泛型使用。你在这里告诉 Java:这个类是通用的,里面用到了一个类型变量 T,具体是什么类型,等使用(实例化)的时候再决定。
✅ 为何可以不指定类型?
因为你是在定义泛型类,而不是使用它。
对比说明:
1. 定义阶段(可以不指定)✅:
public class Result<T> { ... }
这是定义:声明这个类有一个类型参数 T,但你不需要现在就指定 T 是什么类型。
2. 使用阶段(可以指定,也可以不指定):
- ✅ 指定类型(推荐):
Result<String> r = new Result<>();
- ⚠️ 不指定类型(可以,但会丢失泛型信息):
Result r = new Result(); // 原始类型,T 默认为 Object
这会触发“原始类型”用法,Java 会产生 unchecked warning,因为类型信息被擦除了,可能隐藏类型错误。
小结
| 场景 | 是否需要指定类型参数 |
|---|---|
| 定义泛型类/接口 | ❌ 不需要指定类型 |
| 实例化泛型类对象 | ✅ 推荐指定类型 ⚠️ 不指定将使用“原始类型”,可能产生警告 |
2461

被折叠的 条评论
为什么被折叠?



