自定义泛型集合类的核心是通过类型参数(如Java的、Python的Generic[T])实现类型安全与代码复用:Java在编译期检查并类型擦除,Python依赖类型提示和静态检查器(如mypy)保障一致性。

自定义泛型集合类的核心是让类能适配任意类型,同时保持类型安全和代码复用。它不是运行时的魔法,而是通过类型标注 + 类型检查器(如 mypy)在开发阶段提供保障,Python 运行时不做强制约束,Java 则在编译期擦除但保留语义。
Java 中编写自定义泛型集合类
以泛型栈为例,需声明类型参数、用其约束字段与方法签名:
- 定义类时在类名后加
(T 是约定俗成的类型占位符),如 class Stack<t></t> - 成员变量用 T 声明,例如
private List<t> elements = new ArrayList();</t> - 方法参数和返回值也使用 T,如
public void push(T item)和public T pop() - 避免在静态方法中直接使用类级泛型 T;若需泛型,应单独声明,如
public static <e> void print(E e)</e>
Python 中编写自定义泛型集合类
Python 依赖 typing.Generic 和 TypeVar 实现泛型语义,关键步骤清晰:
- 先定义类型变量:
from typing import TypeVar, Generic, List,然后T = TypeVar('T') - 类继承
Generic[T],并在类名后显式标注:class MyStack(Generic[T]): - 所有涉及元素类型的注解都用
T,例如def push(self, item: T) -> None:,def pop(self) -> T: - 注意:仅继承
Generic[T]不足以支持运行时索引(如MyStack[int]),还需确保类已实现__class_getitem__—— 继承Generic即自动满足(标准库及 typing.Generic 已内置)
泛型集合的设计要点
不管语言,写得好用的泛型集合要注意三件事:
-
类型一致性:整个实例生命周期内只操作同一种具体类型,比如
Stack<string></string>不该允许 push 一个 int -
边界控制(可选):Java 可用
<t extends comparable>></t>限定类型必须可比较;Python 可用Bound=TypeVar('Bound', bound=Animal)要求传入类型是 Animal 或其子类 -
避免类型擦除陷阱:Java 中不能用
new T[10](因擦除后无真实类型信息),应改用Array.newInstance(componentType, size)或依赖List;Python 中则无需担心,类型仅用于提示
一个 Python 泛型队列示例
简短可运行的参考结构:
from typing import TypeVar, Generic, List, Optional
T = TypeVar('T')
class Queue(Generic[T]):
def __init__(self) -> None:
self._items: List[T] = []
def enqueue(self, item: T) -> None:
self._items.append(item)
def dequeue(self) -> T:
if not self._items:
raise IndexError("dequeue from empty queue")
return self._items.pop(0)
def is_empty(self) -> bool:
return len(self._items) == 0
使用时:q = Queue[int](),mypy 会校验 q.enqueue("hello") 报错,而 q.enqueue(42) 合法。


















