我有两个接口和一个实现这两个接口的类:
interface A {
int test();
}
interface B {
void test();
}
class X implements A, B {
public void test() { // ==> Error
}
public int test() { // ==> Error
return 10;
}
}
为什么我不能在我的班级X中实施方法“测试”?
NB :这种情况不能通过设计或逻辑来纠正,但我想知道在这种情况下我该怎么做,因为我正在学习java语言,而我想了解这种情况:)
答案 0 :(得分:2)
单独的返回类型不足以让编译器在一种方法或另一种方法之间进行辨别。考虑调用该方法的代码:
instanceOfX.test();
应该调用哪一个? void
因为结果未被分配?如果我想调用int
方法但只是不关心结果怎么办?
方法签名本身(名称和参数)需要不同,以便编译器能够辨别另一个。
答案 1 :(得分:2)
返回类型没有方法签名。方法签名包括:
由于这两个方法具有相同的名称且没有参数,因此它们具有相同的签名。并且你不能在一个类中有两个具有相同签名的方法。
您只能通过更改有关该方法的3件事来解决此问题。
答案 2 :(得分:1)
因为返回类型不足以区分两个方法签名,
分辨率:
更改方法名称或参数列表
答案 3 :(得分:1)
同一个类中不能有多个相同签名的方法,签名包含方法名称及其参数类型。
要让X
同时实施A
和B
,A
或B
中的某个方法需要具有不同的名称和/或签名,或者他们需要具有相同的返回类型,并且一个test
方法就足够了。
答案 4 :(得分:1)
如果你真的在现实生活中遇到这个问题,而且你无法修改A
或B
,那么我认为我X
只能实现其中一个,并且在X
中定义一个新方法以返回另一个方法:
class X implements A {
public int test() {
return 10;
}
private void testForB() {
// do whatever you'd do to implement B's "void test()"
}
public B asB() {
return new B () {
@Override
public void test() {
testForB();
}
};
}
}
然后,任何类型为x
的对象X
且需要将其用作B
的客户端都必须说x.asB()
。也许并不理想,但这将是让事情发挥作用的一种方式。
但是,我认为这个问题不太可能出现在现实生活中。