【发布时间】:2014-08-23 03:48:59
【问题描述】:
有没有办法捕获匿名类的类型?
在下面的例子中,我如何调用匿名类的方法g2?想不出一个绝对有用的具体案例。而且我知道匿名类是供“即时”使用的。然而,想知道。
如果我不能调用它,那么在匿名类中定义它(如果有的话——除了作为匿名类本身的其他方法的帮助者)有什么用?
// http://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
public class SomeClass {
abstract class HelloWorld { abstract public void greet(); }
public void sayHello() {
class EnglishGreeting extends HelloWorld { // local class
String name = "world";
public void greet() { System.out.println("Heya " ); }
public void gg() { System.out.println("do this as well.. ");} }
HelloWorld englishGreeting = new EnglishGreeting();
HelloWorld frenchGreeting = new HelloWorld() { // anonymous class
public void g2() { System.out.println("do this too.. ");}
public void greet() { System.out.println("Salute "); }
};
englishGreeting.greet();
((EnglishGreeting)englishGreeting).gg();
frenchGreeting.greet();
// ((frenchGreeting.getClass())frenchGreeting).g2(); // gives a checked error
}
public static void main(String... args) {
SomeClass myApp = new SomeClass();
myApp.sayHello();
}
}
注意:看到 Can't call anonymous class method 和 Anonymous Inner Classes Inside Methods 以及其他一些相关讨论。
TIA。
//=============================================== =
编辑:
下面的工作——不管它的价值如何,离它更近了一步。在新对象上调用该方法时不查找其引用类型。
HelloWorld frenchGreeting = new HelloWorld() {
public HelloWorld g2() { System.out.println("do this too.. "); return this; }
public void greet() { System.out.println("Salute "); }
}.g2();
【问题讨论】:
-
据我所知这是不可能的,但你为什么还要这样做呢?为什么不创建一个带有可调用方法的真实类?
-
@HovercraftFullOfEels 阅读第二部分——关于“为什么”的“想知道”的短语。
标签: java polymorphism anonymous-class