簡體   English   中英

當將此參數分配給實現該接口的對象時,如何使該接口作為此參數的類型不拋出“不兼容的類型”?

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

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