Java泛型接口的类型参数在实现类implements时确定,而非接口定义处;可直接指定具体类型(如UserRepo implements Repository)或保留泛型传递(如GenericRepo implements Repository)。

Java 中泛型接口的实现,关键在于**子类在继承或实现时明确指定类型参数**,而不是在接口定义处固化类型。接口本身只声明类型变量(如 T),真正“确定类型”的动作发生在具体实现类中。
泛型接口的定义方式
泛型接口用 <t></t> 声明类型参数,方法可使用该类型作为参数、返回值或字段类型:
public interface Repository<t> {
void save(T obj);
T findById(Long id);
List<t> findAll();
}</t></t>在实现类中确定具体类型
有两种常见方式,本质都是在 implements 时传入实际类型:
- 直接指定具体类型:实现类不再保留泛型,类型被“固定”。例如:
public class UserRepo implements Repository<user> {
@Override
public void save(User user) { /* ... */ }
<pre class="brush:php;toolbar:false;">@Override
public User findById(Long id) { /* ... */ }
@Override
public List<user> findAll() { /* ... */ }</user>
}
此时 UserRepo 只能处理 User,所有 T 都被替换为 User。
- 继续保留泛型(类型传递):实现类自身也是泛型,把类型参数“转交”给接口。例如:
public class GenericRepo<t> implements Repository<t private final class> entityType;
<pre class="brush:php;toolbar:false;">public GenericRepo(Class<t> entityType) {
this.entityType = entityType;
}
@Override
public void save(T obj) { /* ... */ }
@Override
public T findById(Long id) { /* ... */ }
@Override
public List<t> findAll() { /* ... */ }</t></t>
}
这样创建实例时才确定类型:GenericRepo<order> orderRepo = new GenericRepo(Order.class);</order>
注意事项与常见误区
- 接口不能直接 new,必须由实现类落地;类型擦除后运行时无法获取
T的真实类型,需配合Class<t></t>参数保留类型信息(尤其做反射或 ORM 映射时) - 不能在静态上下文中引用类型参数(如
static T field;是非法的),因为泛型是实例级别的 - 实现多个泛型接口时,类型可一致也可不同,例如:
class MixedRepo implements Repository<user>, Repository<log></log></user>不合法(重复实现同一接口不同泛型),但可实现Repository<user></user>和Cacheable<string></string>等不同接口
进阶:带边界限定的泛型接口
可通过 extends 限制类型范围,实现类在确定类型时必须满足该约束:
public interface ComparableRepository<t extends comparable>> {
T findMax();
}
<p>// 合法实现(String 实现了 Comparable)
public class StringRepo implements ComparableRepository<string> {
@Override
public String findMax() { /<em> ... </em>/ }
}</string></p>
<p>// 编译错误:User 若未实现 Comparable,则无法这样实现
// public class UserRepo implements ComparableRepository<user> { ... }</user></p></t>不复杂但容易忽略的是:类型确定的动作不在接口里,而在你写 implements X<y></y> 的那一行。写对了,后续所有 T 就自动变成 Y —— 编译器会帮你检查一致性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











