简言:在我们开发过程中特别是代码封装底层经常可以看到,泛型使用 T 或 T extends X 为啥不直接使用T还要使用继承的方式约束泛型类型呢?下面为大家介绍下使用和作用区分。
在Java泛型中,T 和 T extends X 有以下区别:
-
类型限制
T 表示任意类型。
T extends X 表示类型T必须是X或者X的子类。 -
使用场景
使用T时,泛型方法或类可以接受所有类型的参数。
使用T extends X时,确保传入的类型至少具备X类中的属性和方法,增强了类型安全性和代码的可读性。 -
灵活性与约束
T 更加灵活但缺乏约束。
T extends X 在灵活性上有所减少,但在特定业务逻辑下提供了更强的约束,有助于编译期检查错误。
或者可以这么理解:
- T和T extends X有以下主要区别:
无界通配符 (T):
直接使用T表示类型参数T可以是任何类型。
这种情况下,T没有任何限制,可以是任意的类或接口。
例如:List 可以是一个包含任何类型的列表。
public <T> void printList(List<T> list) {
for (T item : list) {
System.out.println(item);
}
}
这个方法可以接受任何类型的List。
有界通配符 (T extends X):
T extends X表示类型参数T必须是X类型或X的子类型。
这种情况下,T受到限制,只能是X或X的子类。
例如:List 表示一个包含Number或其子类型(如Integer, Double等)的列表。
public <T extends Number> void printNumbers(List<T> list) {
for (T number : list) {
System.out.println(number);
}
}
这个方法只能接受Number及其子类型的List。
总结下:
使用T时,类型参数没有任何限制。
使用T extends X时,类型参数必须是X或其子类型。