T extends Type 、? extends Type ?与? super Type 的意义与区别分析
在Java泛型中,T extends Type
、? extends Type
和 ? super Type
是三种不同的类型约束,它们在用法和含义上有所不同。以下是对这三种约束的详细解释和比较:
T extends Type
T extends Type
是在定义泛型类或接口时使用的类型参数约束。它表示泛型类型参数 T
必须是 Type
类型或其子类。这允许你在泛型类或接口的上下文中对 T
进行特定的操作,这些操作是基于 Type
类型或其子类提供的。
示例:
代码语言:javascript代码运行次数:0运行复制public class GenericClass<T extends Number> {
private T value;
public GenericClass(T value) {
this.value = value;
}
public T getValue() {
return value;
}
public void setValue(T value) {
this.value = value;
}
// 可以调用Type类及其子类特有的方法
public double getDoubleValue() {
return value.doubleValue(); // 假设Type是Number或其子类,且该方法存在
}
}
在这个例子中,GenericClass
是一个泛型类,它接受一个类型参数T
,这个T
必须是Number
类或其子类的实例。因此,你可以创建一个GenericClass
的实例,其类型参数是Integer
、Double
、Float
等,这些都是Number
的子类。
? extends Type
? extends Type
是一个通配符类型,用于泛型方法、字段和方法参数。它表示一个未知的类型,这个类型是 Type
类型或其任何子类。当你使用这种通配符时,你不能向这个类型添加元素(如果是集合的话),但你可以从中读取元素,并且这些元素被保证是 Type
类型或其子类型。
示例:
代码语言:javascript代码运行次数:0运行复制public void processTypes(List<? extends Number> numbers) {
for (Number number : numbers) {
// ... 处理每个number ...
}
}
在这个例子中,processTypes
方法接受一个 List
,这个 List
的元素类型是 Number
或其子类。你不能向这个列表添加元素,但可以从中读取元素。
? super Type
? super Type
是另一个通配符类型,它表示一个未知的类型,这个类型是 Type
类型或其任何超类(包括 Type
本身)。这允许你向集合中添加 Type
类型的对象(及其子类),同时可以从集合中读取 Type
类型或其父类型的对象。
示例:
代码语言:javascript代码运行次数:0运行复制public void addNumbers(List<? super Integer> list) {
list.add(new Integer(42)); // 可以添加Integer类型的对象
// ... 但不能添加其他Number类型的对象,除非它们也是Integer或其父类 ...
}
在这个例子中,addNumbers
方法接受一个 List
,这个 List
的元素类型是 Integer
的超类。这意味着你可以向这个列表添加 Integer
类型的对象,但不能添加其他 Number
类型的对象(除非它们也是 Integer
或其父类)。
区别分析
- 使用场景:
T extends Type
用于定义泛型类或接口时的类型参数约束。? extends Type
用于泛型方法参数、字段或返回值,表示一个向下限定的类型,即Type
或其子类型。? super Type
用于泛型方法参数、字段或返回值,表示一个向上限定的类型,即Type
或其父类型。
- 添加与读取:
T extends Type
:可以添加和读取T
类型的对象。? extends Type
:只能从中读取对象,不能向其中添加对象。? super Type
:可以向其中添加Type
类型的对象(及其子类),同时也可以从中读取对象。
- 类型确定性:
T extends Type
:在泛型类或接口的上下文中,T
的具体类型在编译时是已知的(如果提供了足够的类型信息)。? extends Type
和? super Type
:在泛型方法或字段的上下文中,具体类型在编译时是未知的,只知道是Type
或其子类型/父类型。
- 灵活性:
T extends Type
:提供了类型参数的明确约束,但相对更局限。? extends Type
:允许处理多种子类型,但限制了添加操作。? super Type
:允许向集合中添加特定类型及其子类型的对象,同时保持读取的灵活性。
在选择使用哪种类型约束时,应基于你的具体需求,包括是否需要添加元素到集合中,以及需要处理的具体类型范围。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-04-26,如有侵权请联系 cloudcommunity@tencent 删除泛型集合extendssuper对象