为什么不能在Java中调用添加到匿名类的方法?

约旦

如果匿名类正在扩展/实现类/接口,为什么我不能添加新方法?

换句话说,这有效:

class A {
    void a() {
        System.out.println("a in A");
    }
}

class B extends A {
    @Override
    void a() {
        System.out.println("a in B");
    }
    void b() {
        System.out.println("b in B");
    }
}

为什么这样不起作用:

class C {
    A anonA() {
        return new A() {
            void b() {
                System.out.println("b in C");
            }
        };
    }
}

鉴于:

public static void main(String[] args) {
    B b = new B();
    b.b();

    // C c = new C();
    // A anonA = c.anonA();
    // anonA.b();
    // yields:  java: cannot find symbol \ symbol:   method b()
}
Sotirios Delimanolis

在编译时,方法调用是基于调用它们的表达式的类型来确定的。在您的示例中,您尝试调用b()type的表达式AA没有声明b()方法,因此将无法使用。

它也不适用于您的具体B课程示例

A notAnonA = new B();
notAnonA.b(); // fails to compile

您可以很好地在新的匿名类的主体内添加一个新方法,但是您只能在该类内或实际的新匿名类实例创建表达式上使用它。

new A() {
    void undeclared() {}
}.undeclared();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我们不能在main()方法之外将元素添加到ArrayList中?

为什么我不能在golang中将主库添加到我的库中?

为什么在Java中将公共字段添加到匿名类不起作用?

为什么我不能将其他类的常量添加到 java 中的 switch 语句中?

为什么我不能在addEventListener中调用类函数

为什么我不能在另一个类中调用静态方法?

为什么我不能在扩展通用特征的类中调用带有参数“ this”的方法?

为什么我不能在 python 的类中调用我的方法?

为什么不能在Java中其他类的方法中创建类对象?

为什么我们不能在类中为方法添加默认值

为什么不能在Unity3D中将关键帧添加到动画制作器中?

为什么我们不能在Java的普通方法中调用this()方法?

为什么我不能在匿名类中使用<Class> .this?

为什么由于注释而不能在onCreate()中添加方法?

为什么不能在Java中的空指针上调用方法?

为什么我不能在ColdFusion 8中调用java-apns getInactiveDevices()方法?

为什么我不能在 java 中调用 nextLine() 方法两次?

为什么不能在循环中将项目添加到数组?

为什么我不能在方法中引发异常(Java)

为什么move方法不能在Java中工作?

为什么我不能在匿名方法中的while循环中使用break?

为什么不能在匿名内部类中创建新方法?

为什么我不能从事件侦听器调用方法,而不能在类中的其他地方调用方法?

为什么不能在不使stackView成为惰性变量的情况下将subView添加到我的stackView中?

为什么我不能从Python类中调用方法?

在Java 8中,为什么不能调用当前类正在实现的接口静态方法

为什么我不能在VS2019中为对话框添加类?

为什么我不能在MVC6中添加对普通类库的引用

为什么Java中存在匿名类?