簡體   English   中英

調用匿名類的子類方法

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

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