java接口继承用extends关键字,可多继承(如interface a extends b, c),禁止循环继承;同名方法签名必须一致,default方法冲突需显式重写;常量重名无冲突;泛型继承需明确类型参数。

Java接口继承接口的语法怎么写
Java里接口可以继承其他接口,用 extends 关键字,不是 implements ——这是初学者最常混淆的一点。一个接口能继承多个接口,用逗号分隔,和类实现多个接口的语法长得像,但语义完全不同。
-
interface A extends B, C表示 A 继承了 B 和 C 的所有抽象方法(以及默认方法、静态方法、常量) - 被继承的接口不需要加
public修饰符;接口里的方法默认就是public abstract,哪怕不写 - 不能出现循环继承,比如
A extends B且B extends A,编译直接报错:Cyclic inheritance involving A
多接口合并后方法签名冲突怎么办
当两个父接口定义了同名同参数的方法,但返回类型不同(比如一个返回 String,另一个返回 Object),子接口编译失败。Java 要求“继承来的同名方法必须签名一致”,否则无法合并。
- 如果只是返回类型协变(如父接口方法返回
Object,另一父接口返回String),不行——Java 接口不支持协变返回类型继承(这和类的重写不同) - 如果两个接口方法都是
default,且签名完全相同,子接口必须显式重写该方法,否则编译报错:class inherits unrelated defaults for xxx() from types A and B - 常量名重复没关系,只要类型兼容,子接口会继承两者值(但实际只能访问到一个,因为名字一样)
接口继承 vs 类实现接口:什么时候该用哪个
接口继承是“能力叠加”,类实现接口是“能力落地”。别为了省几行代码让接口 A 继承 B 再让类 C 实现 A——如果 B 和 C 本无逻辑关联,这就是过度设计。
- 适合接口继承的场景:
Readable和Writable合并为ReadWriteable;List继承Collection - 不适合的场景:把
Runnable和Serializable合成一个新接口再让业务类去实现——这不是规范,是耦合 - 注意 JDK 8+ 默认方法不会被“继承覆盖”:如果
B有default m(),A extends B没重写,那实现A的类仍可直接调用m(),行为来自B
泛型接口继承时类型参数怎么对齐
带泛型的接口继承,子接口必须明确声明或约束父接口的类型参数,否则编译通不过。常见错误是漏掉类型变量或写错边界。
立即学习“Java免费学习笔记(深入)”;
-
interface Base<t> { void f(T t); }</t>→ 正确继承:interface Sub<t> extends Base<t></t></t>或interface Sub extends Base<string></string> - 错误写法:
interface Sub extends Base(原始类型继承,擦除后可能引发后续使用问题) - 如果想限制类型范围,可用
interface Sub<t extends number> extends Base<t></t></t>,此时T在两边必须一致,不能一边是T一边是U - IDE 有时不报错但运行时泛型信息丢失,建议在子接口上也显式标注泛型,避免下游误用
Map 继承 Iterable 是因为 Map 确实可遍历,不是因为“看起来顺”。一旦把继承变成拼凑工具,后面维护的人就得花三倍时间看懂你在合并什么。










