繁体   English   中英

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

[英]Why can't I create a new method in an anonymous inner class?

如果我有以下课程:

public class TestObject {
  public String Hooray() {
    return "Hooray!";
  }
}

我显然可以实例化该对象,并且我知道必须进行某种子类化,因为我可以覆盖Hooray方法,但是如果有子类化,为什么我不能在匿名类内部创建一个新方法?

TestObject a = new TestObject() {
    public String Boo() {
        return "Booooo";
    }
};

System.out.println(a.Boo());

返回语法错误

您可以创建该方法,您的Boo方法没有任何问题(除了它的前面有一个大写字母之外)。 问题在于,在匿名类之外,Boo方法不可用(它没有作为类API的一部分公开)。

这与实现接口的任何类都是相同的...如果该类具有不属于接口的方法(甚至是公共方法),则您需要将实例转换为特定的类才能访问这些方法。

不幸的是,因为这是一个匿名类,所以您不能将其强制转换(您不知道将其强制转换为什么)。

这些内部方法仍然有用,但是您必须从匿名类内部而不是外部调用它们。

因为该类没有名称,所以您不能在编译时引用其类型定义。 编译器只能将其视为TestObject,而没有boo()方法

你有这个:

public class TestObject {
  public String Hooray() {
    return "Hooray!";
  }
}

TestObject a = new TestObject() {
    public String Boo() {
        return "Booooo";
    }
}

System.out.println(a.Boo());

你做不到 您实际上可以在匿名内部类中创建新方法。 但是您将无法从外部调用a.Boo() ,因为aTestObjectTestObject没有名为Boo方法。 这是您无法执行此操作的相同原因:

public class Base {
    public void something (); 
}

public class Derived extends Base {
    public void another ();
}

Base b = new Derived();
b.another(); // b is a Base, it must be cast to a Derived to call another().

在上面,您必须将b Derived转换为Derived以调用添加到派生类的新方法:

((Derived)b).another();

您无法使用匿名内部类(它们只是派生新子类的语法捷径)无法执行此操作的原因,恰恰是因为它们是匿名的-您无法将其强制转换为任何类型。

顺便说一下,您无法通过Base类型访问another()的原因非常简单。 DerivedBase ,编译器无法知道的方式Base b是持有Derived相对于一些其他子类Base 具有another()方法。

希望能有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM