![](/img/trans.png)
[英]If an class implements an interface, and is assigned to a variable with a type of that interface, what type is that object?
[英]How to make this interface as this parameter's type not throw “incompatible types” when it's assigned to an object that implements the interface?
沒有無關的部分,我有:
public interface A {
// contents
}
public class B implements A {
// contents
}
我想遵循依賴關系插入模式,方法是在我的main方法中實例化B類的對象,然后將其傳遞給C類的構造函數,而不是在C的構造函數中實例化。
public class C {
private final B object;
private int D;
}
public C(A object) {
B = object;
D = object.method();
}
public static void main(String[] args){
C finalobject = new C(new B);
}
本質上,我想做與該問題基於的類似的事情。
我得到錯誤:
C.java:137: error: incompatible types: B cannot be converted to A
C finalobject = new C(new B());
如何使用接口作為參數將B傳遞給C的構造函數?
我嘗試過強制轉換,但出於明顯的原因,我無法首先將其實例化為接口。 我不能將其作為對象的類類型傳遞,不僅因為它不符合我對該程序的行為規范,而且我想學習如何做我一直在嘗試做的事情。
C類的定義應為:
public class C {
private final A object;
private int D;
}
如果您確實需要C類中的B,則必須將C構造函數更改為:
public C(B object) {
B = object;
D = object.method();
}
您忘記了可能還有實現A接口的D,E,F和G類。 從概念上講,這意味着您在做什么。 當然,您知道您要傳遞的內容,並且知道它是B類的一個實例,但是Liskov的“替換原理”會建議您要么完全處理B,要么完全處理A,這取決於哪個角色更適合。 您永遠不需要強制轉換為派生類。
這樣說,您的解決方案就是以下幾種:
public class C {
private final A object;
private int D;
}
您需要在B中調用的所有方法都應相應地添加到A,如果您認為A不適合使用某些方法,則應問自己是否應該將A實例傳遞給C。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.