Java泛型接口通过<T>声明类型参数,实现类可具体化或保持泛型;类型边界用extends限定上界(支持类或接口,多个时类须在前),下界super仅用于通配符;不可用基本类型、instanceof T或new T。

Java 中泛型接口的实现和泛型约束(即类型边界)是让接口更灵活、更安全的关键机制。核心在于:接口定义时声明类型参数,实现类指定具体类型;约束则通过 extends 限定类型必须满足的条件(如继承某个类或实现某个接口)。
泛型接口的定义与实现
泛型接口在声明时用 <T> 引入类型参数,实现类可选择「具体化」该类型,也可以保持泛型。
-
定义泛型接口:
<?> public interface Repository<T> {
T findById(Long id);
void save(T entity);
} -
实现类指定具体类型(非泛型实现):
<?> public class UserRepository implements Repository<User> {
public User findById(Long id) { /* ... */ }
public void save(User user) { /* ... */ }
} -
实现类也保留泛型(泛型实现):
<?> public class GenericRepository<T> implements Repository<T> {
public T findById(Long id) { /* ... */ }
public void save(T entity) { /* ... */ }
}
泛型约束(类型边界)怎么写
用 extends 关键字为类型参数添加上界约束,确保传入的实际类型具备所需能力(如调用某个方法、访问某个字段)。注意:即使约束的是接口,语法仍用 extends。
-
单个上界(类或接口):
<?> interface ComparableRepository<T extends Comparable<T>> {
T findMax();
} -
多个上界(一个类 + 多个接口,类必须写在最前):
<?> interface SafeRepository<T extends BaseEntity & Serializable & Cloneable> {
T cloneEntity(T t);
} -
下界用
super(仅限通配符,不能用于类型参数声明):
<?> void process(List<? super Integer> list); // list 可接收 Integer 或其父类(如 Number、Object)
常见易错点提醒
- 泛型接口的类型参数名(如
T)只在接口内部有效,实现类中重写方法时,返回值/参数类型要与接口一致,不能随意换名或擦除 - 不能用基本类型(如
int)作为类型实参,只能用包装类(Integer) -
extends约束不支持逻辑“或”,比如不能写T extends A | B;需靠设计抽象基类或接口统一行为 - 泛型信息在运行时被擦除,所以不能在实现中用
if (t instanceof T)或new T()—— 需借助Class<T>参数传递类型信息


















