Java泛型<T extends 接口>调用静态方法为何执行接口默认实现
错误原因
- Java 中接口的静态方法不支持被实现类重写,
Test类中定义的同名static void info属于Test类本身的独立静态方法,和Print接口的info方法不存在重写关系,仅属于方法隐藏。 - 泛型的类型参数
T extends Print在编译阶段会执行类型擦除,上限为Print类型,你调用T.info()的时候,编译期就已经把方法绑定到Print的静态info方法上,和实际传入的泛型实参Test完全无关,因此只会输出failed。
修复方案
如果要实现不同实现类走不同逻辑,不要使用静态方法,改为接口的实例抽象方法即可:
public interface Print { // 改为实例抽象方法 void info(String message); } public class Test implements Print { @Override public void info(String message) { System.out.println(message); } } // Draw类调整为持有T的实例调用方法 public class Draw<T extends Print> { private T target; public Draw(T target) { this.target = target; } public void print(String msg) { target.info(msg); } } // 调用逻辑 new Draw<>(new Test()).print("Test"); // 控制台输出Test
内容的提问来源于stack exchange,提问作者SonMooSans
相关产品推荐
相关产品推荐

