簡體   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