我只是为了一些研究目的而学习Java。 我对Java中的接口机制有疑问。 我不知道将界面理解为某种特殊的抽象类是否正确;但我很困惑哪种方法" pr(int _i)"它是在编译时使用的:
public interface A {
int flagA=0;
void pr(int _i);
}
另一个界面B是这样的:
public interface B extends A{
int flagB=0;
double pr(int _i);
}
然后我意识到使用接口A和B的类:
public class inter1 implements A,B {
void pr(int _i){...};
double pr(int _i){...};
}
无法正确编译。当我使用接口B时,这里不会形成覆盖接口A.但是返回类型是否足以区分两种方法?
我已经查阅了Bruce Eckel的 Thinking in Java ,但没有找到任何帮助。
感谢您的时间!
答案 0 :(得分:2)
只有不同的返回类型是不够的。
这是因为编译器不知道要调用哪个方法。如果丢弃任何返回值,则尤其如此。
答案 1 :(得分:2)
Java语言规范section on Requirements in Overriding and Hiding解释了在重写方法时应如何关联返回类型:
如果返回类型为R1的方法声明d1覆盖或隐藏了另一个返回类型为R2的方法d2的声明,那么对于d2,d1必须是return-type-substitutable(第8.4.5节),或者是编译时错误发生。
Section 8.4.5解释了返回类型如何可替换:
具有返回类型R1的方法声明d1是 return-type-substitutable ,用于另一个方法d2,返回类型为R2 iff以下任何一个为真:
如果R1为
void
,则R2为void
。如果R1是基本类型,则R2与R1相同。
如果R1是引用类型,则以下之一为真:
R1,适用于d2(§8.4.4)的类型参数,是R2的子类型。
可以通过未经检查的转换(第5.1.9节)将R1转换为R2的子类型。
d1与d2(§8.4.2)的签名不同,R1 = | R2 |。
因此,如果方法pr
的返回类型为void
,则界面B
中覆盖的方法也必须返回void
。如果返回类型为int
,则覆盖的方法也必须返回int
。对于引用类型,返回类型应为子类型或可转换为子类型:
interface A {
int flagA = 0;
Number pr(int _i);
}
interface B extends A {
int flagB = 0;
Integer pr(int _i); // compiles fine
}
另一方面,
interface A {
int flagA = 0;
Integer pr(int _i);
}
interface B extends A {
int flagB = 0;
Number pr(int _i); // does not compile
}
答案 2 :(得分:0)
您对接口B的定义也会出现编译错误,
作为方法pr()[在接口B中]在接口A中实现pr(),但是返回类型根据实现方法规则不兼容
在实现方法中,返回类型应该是instanceOf
操作返回true值的相同类型或任何类型。(协变类型)
此外,2种方法只能在以下条件下区分
希望这有帮助!
祝你好运!答案 3 :(得分:0)
你不能写两个相同的方法,只改变同一类中的返回类型。
方法重载具有不包含的不同规则返回类型(重载方法可以具有不同数量的参数,参数类型和参数顺序< /强>)
并且您的界面也不会被编译,因为它不能以正确的方式覆盖方法。 共变型仅适用于方法重写,不适用于方法重载。