[英]If a method returns an anonymous class, is it returning a subclass or an inner class?
[英]Invoke a subclass method of an anonymous class
我現在正在嘗試深入研究匿名類,並且只出現了一個問題,我不想參考太多的細節,也不想直接提出我的問題:如何在以下匿名類中調用方法sizzle()
:
public class Popcorn {
public void pop() {
System.out.println("popcorn");
}
}
class Food {
Popcorn p = new Popcorn() {
public void sizzle() {
System.out.println("anonymous sizzling popcorn");
}
public void pop() {
System.out.println("anonymous popcorn");
}
};
public void popIt() {
p.pop(); // OK, Popcorn has a pop() method
p.sizzle(); // Not Legal! Popcorn does not have sizzle()
}
}
在多態規則中,眾所周知並確定的是,超類的引用不能調用子類的方法而不進行下轉換(即使它引用給定子類的對象)。 但是,在上述情況下,調用sizzle()
方法的“關鍵”是什么?
sizzle()
方法根本無法從外部訪問,因為該類是匿名的。
p
引用是Popcorn
類型,它沒有定義sizzle()
。
匿名類本來應該是一次性的,並且在某些設計模式(例如Observer )中大量使用,因為Java沒有一流的功能,即您無法傳遞功能對象。
我有點沒想到這會起作用,但是確實可以:
new Object() {
public void foo() {}
}.foo();
以上內容將按預期進行編譯和工作。 原因是表達式 new Object() {}
的類型是表達式定義的匿名類型,而不是Object
。 但是,您不能具有該類型的變量 (或方法參數),這意味着除了在new
表達式之后鏈接之外,您無法在其他任何地方調用該方法。
由於這並不能真正解決您的(無法解決的)問題,因此,我承認這更多是一種補充性答案。
調用p.sizzle()
,需要使p
變量具有sizzle()
方法的類型。 唯一的方法是使用子類或接口。 如果您不想更改p
的類型,甚至可以強制轉換,但不能強制轉換為匿名類型。
如果僅在Food
類中需要該類,則應在該類中聲明
class Food {
EdiblePopcorn p = new EdiblePopcorn() {
@Override
public void sizzle() {
System.out.println("anonymous sizzling popcorn");
}
@Override
public void pop() {
System.out.println("anonymous popcorn");
}
};
public void popIt() {
p.pop(); // OK, Popcorn has a pop() method
p.sizzle(); // Also legal! EdiblePopcorn now has sizzle()
}
private abstract class EdiblePopcorn extends Popcorn {
// if the sizzle body is always the same, you can declare it here.
void sizzle();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.