没有不相关的部分,我有:
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/