core java的一个类实现多接口的问题(接口中方法同名不同返回)

gaoxiang519 2010-03-18 01:33:09
public class Test{
public static void main(String[] args){
C c1=new C();
c1.m();
}
}

interface A{
void m();
}

interface B{
int m();
}

class C implements A,B{
public void m(){
System.out.println("void m()");
}
public int m(){
System.out.println("int m()");
}
}


以上的代码当然无法通过编译,我的问题就是,当一个类继承了多个接口,而这些接口中又有同名的方法,方法的返回又不同,因此这个类怎么实现这些方法呢。(除了改方法名有什么办法)
...全文
489 15 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
xiesisi3 2010-03-18
做项目应该有个规范啊,搞的两个接口方法名和参数都相同,那肯定不好弄了。
如果你实在不想让他们去改方法名的话,那么只有考虑抽象类了,写一个抽象类实现其中一个接口,并实现该方法,然后自己写一个类继承这个抽象类并实现另外一个接口。

说起来都拗口,别说实际做了,又不合理又麻烦。建议你去让同事把方法名统一一下。
  • 打赏
  • 举报
回复
gaoxiang519 2010-03-18
[Quote=引用 12 楼 xiesisi3 的回复:]
你一定要在同一个类中出现两个不同返回值但却相同参数,相同方法名的方法吗?你有什么需求要这样做?
[/Quote]

我这问题的出发点是这样的。做项目时,各个同事编写了不同的接口,这些接口中可能有方法同名并且不同返回值,而另外某人又写了个类实现这些接口,这样在这个类的方法实现上就会出现问题。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 gaoxiang519 的回复:]

引用 6 楼 lanjie911 的回复:
楼上的没错。

实际上,Java的语义规范里明确了,方法签名包含函数名和参数列表。

参数列表的位置及个数+函数名 共同决定了该函数是否是duplicated。

函数的返回值不是方法签名的一部分。 不能用返回值来判定函数是否duplicated.


但是同方法名,不同返回的方法是不能出现在同一个类中的,无法在同一个类中出现多个,……
[/Quote]

没错,孩子,这种情况在Java语言规范里是明确不支持的。
  • 打赏
  • 举报
回复
xiesisi3 2010-03-18
你一定要在同一个类中出现两个不同返回值但却相同参数,相同方法名的方法吗?你有什么需求要这样做?
  • 打赏
  • 举报
回复
gaoxiang519 2010-03-18
[Quote=引用 6 楼 lanjie911 的回复:]
楼上的没错。

实际上,Java的语义规范里明确了,方法签名包含函数名和参数列表。

参数列表的位置及个数+函数名 共同决定了该函数是否是duplicated。

函数的返回值不是方法签名的一部分。 不能用返回值来判定函数是否duplicated.
[/Quote]

但是同方法名,不同返回的方法是不能出现在同一个类中的,无法在同一个类中出现多个,这样就无法实现两个接口的方法啊。
  • 打赏
  • 举报
回复
xiesisi3 2010-03-18
回8L
那么应该这么写
interface D {
void m(int s); //m()为A、B共有的能力
}
interface A extends D {
void ma(); //ma()为A特有的能力
}
interface B extends D {
void mb(); //mb()为B特有的能力

}
  • 打赏
  • 举报
回复
gaoxiang519 2010-03-18
[Quote=引用 5 楼 soli11722984 的回复:]
写个内部类不就好了吗
[/Quote]

该如何写?请以代码明示
  • 打赏
  • 举报
回复
gaoxiang519 2010-03-18
[Quote=引用 1 楼 houshen13828468384 的回复:]
public class Test{
public static void main(String[] args){
C c1= new C();
c1.m();
}
}

interface A{
void m();
}

interface B{
int m(int s);
}

class C implements A,B{
private int s;
p……
[/Quote]

我把接口A中的方法改成long m(int s)的话你怎么办
  • 打赏
  • 举报
回复
j_tang 2010-03-18
方法中的 方法名 和 方法参数类型列表(不包括参数名) 唯一确定一个方法
只有方法名重名, 参数类型列表不同的多个方法 是可以允许存在的
  • 打赏
  • 举报
回复
楼上的没错。

实际上,Java的语义规范里明确了,方法签名包含函数名和参数列表。

参数列表的位置及个数+函数名 共同决定了该函数是否是duplicated。

函数的返回值不是方法签名的一部分。 不能用返回值来判定函数是否duplicated.
  • 打赏
  • 举报
回复
soli11722984 2010-03-18
写个内部类不就好了吗
  • 打赏
  • 举报
回复
xiesisi3 2010-03-18
接口表示一种能力,不同的接口表示不同的能力,方法名当然不同了。如果方法名相同,表示二者具有相同的能力,那么应该将这两个接口继续抽象,也就是说写一个父类接口,让这两个子类接口去继承他
  • 打赏
  • 举报
回复
micsolaris 2010-03-18
Java里本来就限定死了同个类中不能出现相同方法签名的多一个方法。也就是方法签名和形参必须不能完全相同
  • 打赏
  • 举报
回复
public class Test{
public static void main(String[] args){
C c1=new C();
c1.m1();
c1.m();
}
}

interface A{
void m1();
}

interface B{
void m1();
}

class C implements A,B{
public void m1(){
System.out.println("void m()");
}
public void m(){
System.out.println("int m()");
}
}
这样改可能更符合作者的原意,
其实我觉得不改应该不行,JAVA中命名本身是种艺术,达到目的就好了,何必在乎如何误导读者哩,呵呵
  • 打赏
  • 举报
回复
public class Test{
public static void main(String[] args){
C c1= new C();
c1.m();
}
}

interface A{
void m();
}

interface B{
int m(int s);
}

class C implements A,B{
private int s;
public void m(){
System.out.println("void m()");
}
public int m(int s) {
this.s =s;
System.out.println("int m()");
return s;
}
}


接口B是有返回类型的方法,所以需要参数,加个int s可以了
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE

6.2w+

社区成员

Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
帖子事件
创建了帖子
2010-03-18 01:33
社区公告
暂无公告