最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

T extends Type 、? extends Type?与? super Type 的意义与区别分析

网站源码admin1浏览0评论

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的实例,其类型参数是IntegerDoubleFloat等,这些都是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 或其父类)。

区别分析

  1. 使用场景:
    • T extends Type 用于定义泛型类或接口时的类型参数约束。
    • ? extends Type 用于泛型方法参数、字段或返回值,表示一个向下限定的类型,即 Type 或其子类型。
    • ? super Type 用于泛型方法参数、字段或返回值,表示一个向上限定的类型,即 Type 或其父类型。
  2. 添加与读取:
    • T extends Type:可以添加和读取 T 类型的对象。
    • ? extends Type:只能从中读取对象,不能向其中添加对象。
    • ? super Type:可以向其中添加 Type 类型的对象(及其子类),同时也可以从中读取对象。
  3. 类型确定性:
    • T extends Type:在泛型类或接口的上下文中,T 的具体类型在编译时是已知的(如果提供了足够的类型信息)。
    • ? extends Type 和 ? super Type:在泛型方法或字段的上下文中,具体类型在编译时是未知的,只知道是 Type 或其子类型/父类型。
  4. 灵活性:
    • T extends Type:提供了类型参数的明确约束,但相对更局限。
    • ? extends Type:允许处理多种子类型,但限制了添加操作。
    • ? super Type:允许向集合中添加特定类型及其子类型的对象,同时保持读取的灵活性。

在选择使用哪种类型约束时,应基于你的具体需求,包括是否需要添加元素到集合中,以及需要处理的具体类型范围。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-04-26,如有侵权请联系 cloudcommunity@tencent 删除泛型集合extendssuper对象
发布评论

评论列表(0)

  1. 暂无评论