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