[英]Methods of anonymous classes in Java
有沒有辦法捕獲匿名類的類型?
在下面的示例中,如何調用匿名類的方法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();
}
}
注意:參見“無法調用匿名類方法”和“ 內部匿名類內部方法”以及其他一些相關討論。
TIA。
// ==============================================
編輯:
下面的方法行之有效-無論其價值如何都離它更近了一步。 在新對象上調用該方法時,不查找其引用類型。
HelloWorld frenchGreeting = new HelloWorld() {
public HelloWorld g2() { System.out.println("do this too.. "); return this; }
public void greet() { System.out.println("Salute "); }
}.g2();
不,您不能致電g2。 實際上,java中的匿名類只是實現只在一個地方使用的接口實例的捷徑。 如果使用指定的接口,則要由該接口專門定義要調用的方法。
允許您定義非接口方法的原因是,設計人員考慮了要實現輔助方法的情況。
我認為匿名接口已被廣泛使用。
您只能直接調用它,例如
new HelloWorld() {
// ...
}.g2();
但是,請注意,您不能分配變量並直接調用它,也不能在方法的其他位置調用它。 盡管如此,這是我想回答您的問題最接近的事情。
有沒有辦法捕獲匿名類的類型?
否。您只能訪問它以進行反射。
如果我無法調用它,那么可以在匿名類中定義它(如果有的話,除了可以幫助匿名類本身的其他方法之外)還有什么用?
由於只能從匿名類型本身內部進行引用,因此在其外部沒有用。 因此,正如您所說,它們可能被用來組織類中的邏輯,僅此而已。 唯一的例外是@ bcsb1001描述的極端情況,在這種情況下,您可以直接在匿名對象創建表達式(而不是為其分配的變量)上調用該方法。
下面的工作...
這是因為表達式new HelloWorld() { ... }
的類型是匿名類的類型。 由於創建表達式具有實際的匿名類類型,因此您可以使用它來訪問它聲明的任何成員。 但是,由於類是匿名的 ,所以沒有名稱,因此您不能聲明具體匿名類型的變量。 您可以得到的最接近的是聲明一個HelloWorld
變量。 由於變量聲明為HelloWorld
,因此只能使用它訪問在HelloWorld
或其超類型之一上聲明的成員。
如果Java在聲明中添加了對推斷類型的支持,則可以編寫類似var g = new HelloWorld() { ... };
(C#樣式)或auto g = new HelloWorld() { ... };
(C ++樣式),並且g
的類型將從分配中推斷出來。 這樣一來,您無需類型名稱即可捕獲匿名類型。 但是,Java目前沒有此類功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.