我可以在不同的接口中为不同的方法使用相同的名称吗?
Can I use the same name for different methods in different interface?
我只是为了一些研究目的而学习 Java。
我对Java中的接口机制有疑问。
我不知道将接口理解为某种特殊的抽象是否正确class;但我很困惑"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实现了一个class:
public class inter1 implements A,B {
void pr(int _i){...};
double pr(int _i){...};
}
无法正确编译。当我使用接口 B 时,这里不会形成对接口 A 的覆盖。但是 return 类型是否足以区分两种方法?
我已经在 Java 中查阅了 Bruce Eckel 的 Thinking,但没有找到任何有用的信息。
感谢您的宝贵时间!
只有不同的 return 类型是不够的。
这是因为编译器不知道调用哪个方法。如果丢弃任何 return 值,则尤其如此。
你定义的接口B也会出现编译错误,
as method pr()[in interface B] 在 interface A 中实现 pr() ,但是 return type won't be compatible according to Implementing method rules
在实现方法中,return 类型应该是相同的类型,或者是 instanceOf
操作 return 为真值的任何类型。(协变类型)
另外2种方法只有在以下条件下才能区分
- 参数个数
- 参数类型
- 这些参数的顺序
希望对您有所帮助!
祝你好运!
您不能编写两个相同的方法,仅在 return 类型中进行更改,输入相同的 class。
方法重载具有不包含的独特规则 return 类型(重载方法 可以有 不同数量的参数 , 参数类型和参数顺序)
而且您的界面也不会被编译,因为它没有以正确的方式覆盖方法。
共变类型仅适用于方法覆盖而不适用于方法重载.
Java 语言规范 section on Requirements in Overriding and Hiding 解释了重写方法时 return 类型应该如何关联:
If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs.
Section 8.4.5 解释了 return 类型如何可以替换:
A method declaration d1 with return type R1 is return-type-substitutable for another method d2 with return type R2 iff any of the following is true:
If R1 is void
then R2 is void
.
If R1 is a primitive type then R2 is identical to R1.
If R1 is a reference type then one of the following is true:
R1, adapted to the type parameters of d2 (§8.4.4), is a subtype of R2.
R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9).
d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.
因此,如果方法 pr
的 return 类型是 void
,接口 B
中的重写类型也必须 return 一个 void
。如果 return 类型是 int
,覆盖的方法也必须 return 和 int
。对于引用类型,return 类型应该是子类型或可转换为子类型:
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
}
我只是为了一些研究目的而学习 Java。 我对Java中的接口机制有疑问。 我不知道将接口理解为某种特殊的抽象是否正确class;但我很困惑"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实现了一个class:
public class inter1 implements A,B {
void pr(int _i){...};
double pr(int _i){...};
}
无法正确编译。当我使用接口 B 时,这里不会形成对接口 A 的覆盖。但是 return 类型是否足以区分两种方法?
我已经在 Java 中查阅了 Bruce Eckel 的 Thinking,但没有找到任何有用的信息。
感谢您的宝贵时间!
只有不同的 return 类型是不够的。
这是因为编译器不知道调用哪个方法。如果丢弃任何 return 值,则尤其如此。
你定义的接口B也会出现编译错误,
as method pr()[in interface B] 在 interface A 中实现 pr() ,但是 return type won't be compatible according to Implementing method rules
在实现方法中,return 类型应该是相同的类型,或者是 instanceOf
操作 return 为真值的任何类型。(协变类型)
另外2种方法只有在以下条件下才能区分
- 参数个数
- 参数类型
- 这些参数的顺序
希望对您有所帮助!
祝你好运!
您不能编写两个相同的方法,仅在 return 类型中进行更改,输入相同的 class。
方法重载具有不包含的独特规则 return 类型(重载方法 可以有 不同数量的参数 , 参数类型和参数顺序)
而且您的界面也不会被编译,因为它没有以正确的方式覆盖方法。 共变类型仅适用于方法覆盖而不适用于方法重载.
Java 语言规范 section on Requirements in Overriding and Hiding 解释了重写方法时 return 类型应该如何关联:
If a method declaration d1 with return type R1 overrides or hides the declaration of another method d2 with return type R2, then d1 must be return-type-substitutable (§8.4.5) for d2, or a compile-time error occurs.
Section 8.4.5 解释了 return 类型如何可以替换:
A method declaration d1 with return type R1 is return-type-substitutable for another method d2 with return type R2 iff any of the following is true:
If R1 is
void
then R2 isvoid
.If R1 is a primitive type then R2 is identical to R1.
If R1 is a reference type then one of the following is true:
R1, adapted to the type parameters of d2 (§8.4.4), is a subtype of R2.
R1 can be converted to a subtype of R2 by unchecked conversion (§5.1.9).
d1 does not have the same signature as d2 (§8.4.2), and R1 = |R2|.
因此,如果方法 pr
的 return 类型是 void
,接口 B
中的重写类型也必须 return 一个 void
。如果 return 类型是 int
,覆盖的方法也必须 return 和 int
。对于引用类型,return 类型应该是子类型或可转换为子类型:
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
}