簡體   English   中英

Java中的匿名類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM