目录
What does ? extends T mean?
When to use ? extends T
Limitations: Why you can't add elements
PECS Principle: Producer Extends, Consumer Super
首页 Java java教程 如何在Java中使用通配符(?扩展t)的仿制药?

如何在Java中使用通配符(?扩展t)的仿制药?

Sep 20, 2025 am 02:47 AM
通配符 泛型

? extends T 表示“未知的 T 子类型”,用于泛型中实现只读操作,允许接受 T 或其任意子类的集合,适用于读取数据但不写入的场景,如 List extends Number> 可接收 List、List,遵循 PECS 原则中的“生产者”角色,确保类型安全。

How to use generics with wildcards (? extends T) in Java?

Generics with wildcards in Java, especially ? extends T, are used to create flexible and type-safe code when working with collections or methods that operate on related types. This wildcard is known as a bounded wildcard and allows you to accept any subtype of a given type T.

What does ? extends T mean?

The expression ? extends T means "an unknown type that is a subclass of T (or T itself)." It's useful when you want to read from a data structure but not write arbitrary elements into it.

Important: You can retrieve elements from such structures and treat them as type T, but you cannot safely add elements (except null) because the actual type is unknown.

When to use ? extends T

Use ? extends T when your method only needs to read elements from a generic collection and work with them as instances of T. This supports polymorphism in generics — for example, passing a List where a List is expected (if Dog extends Animal).

Example: A method that sums numbers
public static double sum(List<? extends Number> list) {
    double total = 0;
    for (Number num : list) {
        total  = num.doubleValue();
    }
    return total;
}

This method accepts:

  • List
  • List
  • List
  • Any list of a type that extends Number

You can iterate and call doubleValue() because every element is guaranteed to be a Number or its subtype.

Limitations: Why you can't add elements

Because the exact type is unknown, Java prevents adding non-null objects to maintain type safety.

List<? extends Number> numbers = new ArrayList<Integer>();
numbers.add(42);        // ❌ Compile error
numbers.add(new Float(3.14)); // ❌ Also compile error

The compiler doesn’t know if the list holds Integer, Double, etc., so any addition could break type integrity.

PECS Principle: Producer Extends, Consumer Super

A helpful mnemonic from Effective Java:

  • If a parameterized object is a producer of data (you read from it), use ? extends T.
  • If it’s a consumer (you write to it), use ? super T.
Example combining both:
public static <T> void copy(List<? super T> dest, List<? extends T> src) {
    for (T item : src) {         // reading from source (producer)
        dest.add(item);          // writing to destination (consumer)
    }
}

Here, src produces T values (so uses ? extends T), and dest consumes them (so uses ? super T).

Basically, ? extends T gives flexibility for reading across subtypes while keeping compile-time type safety. Just remember: read-only access when using this wildcard.

以上是如何在Java中使用通配符(?扩展t)的仿制药?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Stock Market GPT

Stock Market GPT

人工智能驱动投资研究,做出更明智的决策

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

泛型函数在Golang中解决可变参数类型的问题吗? 泛型函数在Golang中解决可变参数类型的问题吗? Apr 16, 2024 pm 06:12 PM

Go中的泛型函数解决了可变参数类型的问题:泛型函数允许使用类型参数,在运行时指定。这使得编写可以处理不同类型参数的函数成为可能。例如,Max函数是一个泛型函数,它接受两个可比较参数并返回较大值。通过使用泛型函数,我们可以编写更灵活通用的代码,可处理不同类型的参数。

golang中泛型的具体应用场景 golang中泛型的具体应用场景 May 04, 2024 am 11:45 AM

泛型在Go中的应用场景:集合操作:创建适用于任何类型的集合操作,例如过滤。数据结构:编写通用的数据结构,如队列,栈和映射,可存储和操作各种类型的数据。算法:编写通用的算法,如排序,搜索和归约,可处理不同类型的数据。

Golang泛型对函数签名和参数的影响是什么? Golang泛型对函数签名和参数的影响是什么? Apr 17, 2024 am 08:39 AM

泛型对Go函数签名和参数的影响包括:类型参数:函数签名可包含类型参数,指定函数可使用的类型。类型约束:类型参数可具有约束,指定其必须满足的条件。参数类型推断:编译器可推断未指定类型参数的类型。指定类型:可显式指定参数类型以调用泛型函数。这提高了代码的可重用性和灵活性,允许编写可与多种类型一起使用的函数和类型。

Java 枚举类型如何与泛型配合使用? Java 枚举类型如何与泛型配合使用? May 04, 2024 am 08:36 AM

Java中枚举类型与泛型的结合:声明带泛型的枚举时需添加尖括号,T为类型参数。创建泛型类时,同样需添加尖括号,T为可存储任何类型的类型参数。此结合提高代码灵活性、类型安全性,并简化代码。

Java 函数泛型的上限和下限是什么?如何使用? Java 函数泛型的上限和下限是什么?如何使用? Apr 26, 2024 am 11:45 AM

Java函数泛型允许设置上限和下限。上限(extends)指定函数接受或返回的数据类型必须是指定类型的子类型,例如。下限(super)指定函数接受或返回的数据类型必须是指定类型的超类型,例如。泛型使用可提高代码的可重用性和安全性。

泛型函数在Golang中的限制是什么? 泛型函数在Golang中的限制是什么? Apr 16, 2024 pm 05:12 PM

Go泛型函数的限制:仅支持类型参数,不支持值参数。不支持函数递归。不能显式指定类型参数,由编译器推断。

C++模板和泛型的比较? C++模板和泛型的比较? Jun 04, 2024 pm 04:24 PM

C++中模板和泛型的区别:模板:编译时定义,明确类型化,效率高,代码体积小。泛型:运行时类型化,抽象接口,提供灵活性,效率较低。

Java 泛型方法如何进行类型推断? Java 泛型方法如何进行类型推断? May 01, 2024 pm 02:45 PM

Java泛型方法可自动推断类型参数,无需明确声明。规则包括:1.使用明确类型声明;2.推断单个类型;3.推导出通配符类型;4.推断构造函数返回值类型。这简化了代码,使其更易于编写和使用泛型方法。

See all articles