簡體   English   中英

當輸入類型是接口且參數類型正在實現類時,Java為什么找不到合適的方法?

[英]Why can't Java find a suitable method when the input types are interfaces and the parameter types are implementing classes?

我有一個看起來像這樣的類設置:

interface I{}

class A implements I{}
class B implements I{}
class C implements I{}

class D{
    I a;
    I b;

    public D(I a, I b){
        this.a = a;
        this.b = b;
    }

    public void doSomething(){
        D.someMethod(a, b);
    }

    public static someMethod(A, A){//do something}
    public static someMethod(A, B){//do something}
    public static someMethod(A, C){//do something}
    public static someMethod(B, B){//do something}
    public static someMethod(B, C){//do something}
}

我真的很驚訝地發現它無法編譯。 它會拋出錯誤,指出無法為II類型找到合適的方法someMethod 我認為它會起作用,因為如果IABC的超類,那它將起作用。 Java為什么不允許這樣做? 有沒有解決方法,例如使I成為抽象類?

另外,該模式是否有名稱,所以我不必一直將其稱為“此”?

簽名public static someMethod(A, A)可以接受A或更多派生的A類型。 類似地, (A,B)等簽名。

您將需要一個接受(I,I)的方法,以便使用您在上面勾勒出的類ABC進行調用。 可替換性沿繼承鏈延伸-您定義的形式參數必須是您希望共有的最不特定的類型,然后可以傳入該類型的任何適當的繼承者或實現者。

在編譯時,將根據所提供參數的編譯時類型(以及其他方法)來選擇方法。

在這里,您的參數的類型為I ,但是您的D類沒有提供帶有兩個類型為I參數的static方法。

想象一下這種情況:

new D( new I() {}, new I() {} ).doSomething();

這是完全合法的,但是這些參數絕對不適合您提供的任何實現。

編譯器無法知道或強制I只能由ABC

如果您發現自己處於這種情況,則通常表明設計不佳。 解決方案是以一種對接口I無關的方式編寫接口I ,該接口I與實現該接口的方法無關。

接口的目的(大致而言)是定義通用功能。 如果該功能並非在所有實現者之間都通用,則沒有理由在那里建立接口。

顧名思義,您似乎正在嘗試使用多個調度。

暫無
暫無

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

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