[英]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}
}
我真的很驚訝地發現它無法編譯。 它會拋出錯誤,指出無法為I
和I
類型找到合適的方法someMethod
。 我認為它會起作用,因為如果I
是A
, B
和C
的超類,那它將起作用。 Java為什么不允許這樣做? 有沒有解決方法,例如使I
成為抽象類?
另外,該模式是否有名稱,所以我不必一直將其稱為“此”?
簽名public static someMethod(A, A)
可以接受A
或更多派生的A
類型。 類似地, (A,B)
等簽名。
您將需要一個接受(I,I)
的方法,以便使用您在上面勾勒出的類A
, B
, C
進行調用。 可替換性沿繼承鏈延伸-您定義的形式參數必須是您希望共有的最不特定的類型,然后可以傳入該類型的任何適當的繼承者或實現者。
在編譯時,將根據所提供參數的編譯時類型(以及其他方法)來選擇方法。
在這里,您的參數的類型為I
,但是您的D
類沒有提供帶有兩個類型為I
參數的static
方法。
想象一下這種情況:
new D( new I() {}, new I() {} ).doSomething();
這是完全合法的,但是這些參數絕對不適合您提供的任何實現。
編譯器無法知道或強制I
只能由A
, B
或C
。
如果您發現自己處於這種情況,則通常表明設計不佳。 解決方案是以一種對接口I
無關的方式編寫接口I
,該接口I
與實現該接口的方法無關。
接口的目的(大致而言)是定義通用功能。 如果該功能並非在所有實現者之間都通用,則沒有理由在那里建立接口。
顧名思義,您似乎正在嘗試使用多個調度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.