[英]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()
,因為a
是TestObject
而TestObject
沒有名為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()
的原因非常簡單。 而Derived
為Base
,編譯器無法知道的方式Base b
是持有Derived
相對於一些其他子類Base
不具有another()
方法。
希望能有所幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.