java - 如何使这个接口(interface)作为这个参数的类型在分配给实现该接口(interface)的对象时不抛出 "incompatible types"?

标签 java interface parameter-passing

没有不相关的部分,我有:

public interface A {
// contents
}

public class B implements A {
// contents
}

我想遵循依赖插入模式,在主方法中实例化类 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);
}

本质上,我想做 something similar to what this question is based on.

我收到错误:

C.java:137: error: incompatible types: B cannot be converted to A
      C finalobject = new C(new B());

如何以接口(interface)作为参数将 B 传递到 C 的构造函数中?

我尝试过对其进行强制转换,但由于显而易见的原因,我无法首先将其实例化为界面。我无法将它作为对象的类类型传递,不仅因为它不符合我对该程序的行为方式的规范,而且我想了解如何做我一直在尝试做的事情.

最佳答案

您忘记了还可能有实现 A 接口(interface)的 D、E、F 和 G 类。这意味着您所做的事情在概念上是错误的。当然,您知道您在内部传递的内容,并且您知道它是 B 类的实例,但是 Liskov's Substitution Principle建议你要么完全处理B,要么完全处理A,这取决于什么更适合这个角色。您不应该需要强制转换为派生类。

也就是说,您的解决方案如下:

public class C {
  private final A object;
  private int D;
}

您需要在 B 中调用的任何方法都应该相应地添加到 A 中,如果您认为 A 不适合具有某些方法,那么您应该问问自己是否应该将 A 实例传递给 C首先。

希望有帮助!

关于java - 如何使这个接口(interface)作为这个参数的类型在分配给实现该接口(interface)的对象时不抛出 "incompatible types"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35769486/

相关文章:

java - 如何在 Spark Streaming 中获取当前批处理时间戳

java - java正则表达式可以匹配存在或不存在的字符串吗?

ios - iPhone 应用编程 : best element from the interface builder to display calculated values

delphi - 为什么编译器对我的泛型函数参数提示 "incompatible types"?

sql - ms sql 存储过程返回数据没有输出

javascript - Vaadin 14 中的 Google map

java - Cucumber+TestNG+Cucable插件: How can I pass the appium driver instance that I create in the @beforemethod instance to the page objects?

delphi - 如何从Delphi中的接口(interface)引用获取RTTI?

java - 解释这个关于对象引用转换的输出?

c - C中将数组和数组指针传递给函数的区别