Java中如何调用inline class(内联类)内自定义的新增方法
问题原因说明
首先你提到的「inline class(内联类)」属于术语混淆:你代码中用到的动态创建子类的机制是Java的匿名内部类,而Java官方提案中的inline class是值类型相关的特性,和当前场景无关。
匿名内部类完全支持新增自定义方法和属性,你代码报错是受Java静态类型机制约束:
你将匿名内部类的实例赋值给了Animals类型的父类引用cat,编译阶段编译器只会识别cat的类型是Animals,而Animals类中并没有定义color()方法,因此调用cat.color()会触发编译错误。
访问自定义方法的实现方式
有两种常用方案可以正常调用你新增的color()方法:
- 直接调用匿名实例的方法,不赋值给父类引用
public class Main { public static void main(String[] args) { // 直接创建匿名内部类实例并调用自定义方法 new Animals("Cat") { @Override public void makeNoise() { System.out.println("MEOW MEOW"); } public void color() { System.out.println("Color is: white"); } }.color(); } }
- (Java 10及以上版本支持)用
var关键字自动推断变量类型
编译器会自动识别cat的实际类型是你创建的匿名子类,就可以正常调用自定义方法:
public class Main { public static void main(String[] args) { var cat = new Animals("Cat") { @Override public void makeNoise() { System.out.println("MEOW MEOW"); } public void color() { System.out.println("Color is: white"); } }; cat.makeNoise(); cat.color(); // 编译正常,不会报错 } }
补充说明
匿名内部类并非只能重载父类已有方法,你可以随意新增自定义的方法、成员变量,甚至静态成员,只是如果用父类类型的引用接收实例,就只能访问父类中已经声明过的成员。
内容的提问来源于stack exchange,提问作者Akash Nath
相关产品推荐
相关产品推荐

