全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📝 1 篇文章 20 道配套习题

泛型详解专题

专题说明

本专题系统讲解Java泛型的核心知识点,泛型是Java 5引入的特性,提供类型安全检查和代码复用能力,是Java集合框架和各类库的基础。

学习目标

  1. 掌握泛型类和泛型接口的定义与使用
  2. 理解泛型方法的定义与类型推断机制
  3. 掌握类型通配符(?、? extends、? super)的使用与PECS原则
  4. 理解类型擦除机制及其影响
  5. 掌握泛型与继承的不变性问题
  6. 了解通过反射获取泛型信息的方法
  7. 理解泛型数组的限制与替代方案

学习内容

本专题涵盖九大核心知识点:

知识点核心内容
泛型类类型参数定义、实例化语法
泛型接口接口定义、两种实现方式
泛型方法类型参数位置、类型推断
类型通配符上界通配符、下界通配符、PECS原则
类型擦除擦除机制、桥接方法、运行时限制
泛型与继承不变性、协变与逆变概念
泛型与反射ParameterizedType、获取泛型信息
泛型与数组禁止创建泛型数组、替代方案
泛型最佳实践原始类型、类型参数命名

学习建议

  1. 理解类型擦除:泛型本质是编译时特性,运行时类型信息被擦除
  2. 掌握PECS原则:生产者用extends,消费者用super,这是通配符使用的核心
  3. 区分泛型类与方法:泛型类的类型参数在整个类有效,泛型方法的类型参数只在方法内有效
  4. 注意不变性:List不是List的子类型,这是泛型的重要限制

📝 发现内容有误?点击此处直接编辑

📝 配套习题(20 题)

1
单选题

关于泛型类的定义,以下哪个是正确的语法?

A

public class Box { private T value; }

B

public class Box<T, V> { private T value; }

C

public class Box { private type value; }

D

public class Box { private T value; }

2
填空题

Java泛型类常用的类型参数命名约定:______表示任意类型,______表示集合元素类型,______表示键类型,______表示值类型,______表示数值类型。

3
单选题

关于泛型接口,以下说法正确的是:

A

实现泛型接口时必须指定具体类型

B

实现泛型接口时可以保留类型参数,创建泛型实现类

C

泛型接口不能有多个类型参数

D

泛型接口的方法不能使用接口的类型参数

4
判断题

一个类实现泛型接口时,既可以指定具体类型,也可以保留泛型参数成为泛型类。

A

B

5
单选题

关于泛型方法,以下说法正确的是:

A

泛型方法只能定义在泛型类中

B

泛型方法的类型参数声明必须在返回值类型之前

C

泛型方法的类型参数与泛型类的类型参数是同一个

D

泛型方法不能使用静态修饰符

6
单选题

以下代码的执行结果是什么?

Java
public static <T> T first(List<T> list) {
    return list.get(0);
}
List<String> strings = Arrays.asList("a", "b", "c");
String result = first(strings);
A

编译错误,需要显式指定类型参数

B

编译成功,编译器推断T为String

C

编译成功,返回Object类型需要强转

D

运行时抛出ClassCastException

7
填空题

泛型方法的类型参数声明必须在__________之前,语法格式为:________________________

8
单选题

PECS原则的含义是什么?

A

Producer Extends Consumer Super - 生产者用extends,消费者用super

B

Producer Super Consumer Extends - 生产者用super,消费者用extends

C

Private Extends Public Super - 私有继承公有

D

Parameter Extends Class Super - 参数继承类

9
多选题

关于泛型通配符的限制,以下说法正确的有哪些?

A
B
C
D
10
单选题

Java泛型的类型擦除机制是什么?

A

编译时擦除类型参数,运行时保留泛型信息

B

编译时擦除类型参数,运行时泛型信息被替换为边界类型或Object

C

运行时擦除类型参数,编译时保留泛型信息

D

泛型信息不会被擦除,一直保留到运行时

11
判断题

由于类型擦除,在运行时完全无法获取任何泛型类型信息。

A

B

12
单选题

以下哪个赋值语句是正确的?

A

List list = new ArrayList();

B

List list = new ArrayList();

C

List list = new ArrayList();

D

Object[] array = new String[10]; // 这行正确,但List list = new ArrayList()不正确

13
单选题

泛型类本身可以继承其他类吗?

A

泛型类不能继承其他类

B

泛型类可以继承普通类或泛型类

C

泛型类只能继承泛型类

D

泛型类只能继承普通类

14
单选题

如何通过反射获取方法参数的泛型类型?

A

method.getParameterTypes()

B

method.getGenericParameterTypes()

C

method.getReturnType()

D

method.getTypeParameters()

15
判断题

Field.getType()和Field.getGenericType()返回结果相同,因为泛型信息在运行时被擦除。

A

B

16
单选题

以下哪种方式可以创建泛型数组?

A

new T[10]

B

new List[10]

C

(T[]) new Object[10]

D

以上都不可以

17
判断题

Java禁止创建泛型数组,但也禁止声明泛型数组类型的变量。

A

B

18
单选题

泛型类有两个类型参数时,应该使用什么命名?

A

T1和T2

B

T和S

C

K和V(如果表示键值)

D

以上都可以,但K和V更符合约定(键值场景)

19
填空题

泛型最佳实践的核心原则:避免使用________;使用______原则选择通配符;优先使用________而非泛型类;确认类型安全后使用_________________消除警告。

20
单选题

为什么Java数组是协变的,而泛型是不变的?

A

数组更高级,泛型设计有缺陷

B

数组早期设计为了灵活性,泛型设计为了类型安全

C

数组运行时检查类型,泛型编译时检查类型

D

以上都是正确的原因

← 上一个专题 数组与方法专题
下一个专题 → 线程安全与同步机制专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库