假设您有一个接口A
和一个接口B
。假设Sprite
类实现了两个接口。
假设另一个类有一个方法foo(A object)
,并且还有一个方法foo(B object)
。
当我将Sprite
的实例传递给方法foo()
时,是否会调用它们?如果没有,哪个优先?
答案 0 :(得分:8)
使用方法重载(就像在这里使用的那样),调用的方法在编译时根据保存Sprite
的变量的(声明的)类型来解析。 / p>
由于方法调用不明确,因此在手动向下转换引用以解决歧义之前,这将无法编译。
答案 1 :(得分:4)
这是模棱两可的。您需要转换为其中一个接口。
答案 2 :(得分:3)
interface A {}
interface B {}
class Sprite implements A,B {}
class Test{
void foo(A a){}
void foo(B b){}
void test(){
Sprite s = new Sprite();
foo(s); // <-- compile time error (The method foo(A) is ambiguous for the type Test)
}
}
答案 3 :(得分:0)
一般答案需要几页解释;见the relevant section in the language specification。
在您呈现的特定情况下,它不会编译。但在其他情况下,有一些规则可以使编译器更喜欢一个重载到另一个并解决冲突。
最重要的规则是,一般来说,如果一种方法比其他方法更具体,则选择该方法。如果方法A的所有可能的调用在调用方法B时也会编译,则方法A 比方法B更具体。这通常意味着方法A的某些形式参数是从相应的子类中创建的。方法B中的形式参数。在少数情况下,这将不适用,例如当需要自动装箱或其他“方法转换”以使参数适合“否则更具体”的情况时。有关细节,请参阅规范。