泛型接口的类型参数必须在实现时明确:非泛型类实现需指定具体类型如String;泛型类实现须透传类型参数;子接口继承时须立即确定父接口类型参数;静态成员不可引用类型参数;类型选择应遵循业务自然、调用简洁、错误早暴露原则。

泛型接口本身不绑定具体类型,它的类型参数必须在被实现时明确——这个“明确”不是随意填写,而是由实现类的用途、复用性与类型安全目标共同决定的。关键在于:接口定义留白,实现类填空;填什么,取决于你打算怎么用它。
非泛型类实现时:直接锁定一个具体类型
当实现类职责单一、只处理某一种数据(比如只存取字符串),就用具体类型固化接口参数。这最简单,也最安全。
- 必须在
implements子句中写出完整类型,如implements MyGenericInterface<string></string> - 接口中所有带
T的位置,自动变为String,编译器会强制检查 - 不能写成
implements MyGenericInterface(省略类型),否则T默认为Object,失去泛型意义
泛型类实现时:把类型参数“透传”过去
如果实现类本身也要支持多种类型(比如一个通用容器),那就让类的类型参数和接口的类型参数保持一致。
- 声明为
class Container<t> implements MyGenericInterface<t></t></t> - 此时
T是类的形参,也是接口的实参,调用方在创建Container<integer></integer>时,整个链条的类型就确定了 - 不能混用不同名称(如
class Container<u> implements MyGenericInterface<t></t></u>),编译不通过
接口继承时:子接口必须立即确定父接口的类型参数
如果定义新接口去扩展一个泛型接口,不能继续泛化——必须当场指定父接口的类型参数。
- 允许:
interface StringProcessor extends MyGenericInterface<string></string> - 不允许:
interface GenericProcessor<t> extends MyGenericInterface<t></t></t>(这是重定义,不是继承) - 静态成员不可引用接口定义的类型参数,因为静态内容与实例类型无关
类型选择的实用判断原则
选什么类型,不看语法能不能通,而要看业务逻辑是否自然、调用是否简洁、错误是否早暴露。
- 优先选最小必要类型:需要排序就用
Comparable<t></t>约束,不需要泛滥用Object - 避免过度泛化:一个只处理
Cat的服务类,硬写成<T extends Animal>反而增加理解成本 - 注意类型擦除影响:运行时无法获取
T的真实类信息,若需反射或序列化,得额外传入Class<T>

















