You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在匿名类定义外部调用其未在父接口中声明的自定义方法?

问题原因

你遇到的调用失败是Java静态类型检查的固有规则导致的:编译器识别可调用方法时,只看变量的声明类型,不会识别变量实际指向的子类/实现类中新增的成员。你将匿名类实例赋值给了Phone接口类型的变量,因此编译器只能识别Phone接口中定义的3个方法,无法识别匿名类里新增的launchCamera方法。

解决方法

方法1:使用var推导变量类型(Java 10及以上版本支持)

不需要显式将变量声明为Phone类型,使用var关键字让编译器自动推导变量为匿名类的实际类型,即可直接调用新增方法:

public class App {
    public static void main(String[] args) throws Exception {
        // 用var替代显式的Phone类型声明
        var smartPhone = new Phone() {
            @Override
            public void turnOn() { System.out.println("Turning on..."); }

            @Override
            public void turnOff() { System.out.println("Turning off..."); }
            
            @Override
            public void makeCall() { System.out.println("Calling..."); }

            public void launchCamera() { System.out.println("Launching camera..."); }            
            
        };
        // 可正常调用
        smartPhone.launchCamera();
    }
}

方法2:创建实例时直接调用(兼容所有Java版本)

匿名类没有可被显式引用的类名,Java 10之前没有var语法的场景下,只能在创建匿名类实例的同时直接调用新增方法,无法先赋值给Phone类型变量后再调用:

new Phone() {
    @Override
    public void turnOn() { System.out.println("Turning on..."); }
    @Override
    public void turnOff() { System.out.println("Turning off..."); }
    @Override
    public void makeCall() { System.out.println("Calling..."); }
    public void launchCamera() { System.out.println("Launching camera..."); }            
}.launchCamera();
相关规则官方说明位置

对应规则可在《Java语言规范(JLS)》中查询:

  • 第4.12.2节「变量的类型」:明确规定变量的声明类型决定了该变量引用的对象可访问的成员范围
  • 第15.9.5节「匿名类声明」:说明匿名类属于没有可引用名称的本地类,仅继承/实现声明时指定的父类或接口的成员

内容的提问来源于stack exchange,提问作者Nirvan-StackOverflow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:06:08