簡體   English   中英

我如何強制java方法運行特定的實現

[英]How do i force java methods to run specific implementations

我有2個重載方法,一個運行超類,另一個運行子類。 我希望在發送子類時,java會知道運行特定於子類的方法。 唉,它運行的是超類之一。 這是一個例子:

public class Test {

    static class SuperClass {}

    static class SubClass extends SuperClass {}

    static void stuff(SuperClass superclass) {
        System.out.println("IN 1");
    }

    static void stuff(SubClass subClass) {
        System.out.println("IN 2");
    }

    public static void main(String[] args) {
        SuperClass aClass = new SubClass() ;

        stuff(aClass) ;
    }
}

我希望打印“IN 2”,但我得到“IN 1”

所以我有兩個問題:1。為什么會這樣?2。我如何實現我想要的結果?

提前致謝

為什么會這樣

因為重載解析在編譯時發生,並且aClass變量的編譯時類型是SuperClass

我如何實現我想要的結果?

aClass的編譯時類型aClassSubClass

SubClass aClass = new SubClass();

或者在方法調用中強制轉換:

stuff((SubClass) aClass);

如果你想真正能夠處理任何SuperClass ,你應該考慮覆蓋而不是重載 ,或訪問者模式 / 雙重調度

通過將aClass聲明為SubClass的實例

 SuperClass aClass = new SubClass() ;

即使您將其實例化為SubClass,也可以將其聲明為SuperClass。 將該行更改為:

SubClass aClass = new SubClass() ;

然后再試一次。

就像Skeet先生所說,它正在發生,因為aClass變量的編譯時類型是SuperClass 以下是使用接口instanceof

public class Legit {

    public static interface Animal {}

    public static abstract class Mammal implements Animal {}

    public static class Lion extends Mammal {}

    public static class Cow extends Mammal {}

    public static abstract class Reptile implements Animal {}

    public static class Snake extends Reptile {}

    public static void doSomething(Animal animal) {
        if (animal instanceof Lion) {
            System.out.println("RAAWWRR!");
        } else if (animal instanceof Cow) {
            System.out.println("MOOO!");
        } else if (animal instanceof Reptile) {
            System.out.println("HISSSSS!");
        }
    }

    public static void main (String ... args) {
        Animal animal1 = new Lion();
        Animal animal2 = new Cow();
        Animal animal3 = new Snake();

        doSomething(animal1);
        doSomething(animal2);
        doSomething(animal3);
    }
}

輸出:

RAAWWRR!
MOOO!
HISSSSS!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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