A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙天 黑马帝   /  2012-4-11 10:54  /  2744 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

接口与接口之间可以多继承,如果子接口继承的多个父接口有相同的方法,但是返回值类型不同,被实现后如何实例化?

8 个回复

倒序浏览
方法可以被重写啊。
回复 使用道具 举报
如果一个类实现多个接口,而父接口的同名方法返回的类型不一样的话,那么这个类就建立不了,怎么都报错。我试了一下你说的这种情况,当一个接口继承多个接口的时候,由于是接口继承接口,所以,子接口并不需要全部重写父接口的方法,当你用子接口去复写多个父类中的同名但返回类型不同的方法时,编译器会报错,因为你写的这些方法连重载都不是。所以也不能被实例化
回复 使用道具 举报
zhouxp3323 发表于 2012-4-11 11:21
如果一个类实现多个接口,而父接口的同名方法返回的类型不一样的话,那么这个类就建立不了,怎么都报错。我 ...

那会不会有这样一个接口,里面方法名一样返回值不一样,被实现后都无法实例化
回复 使用道具 举报
这个问题基本是无解的,在《Thinking in java 》第四版 机械工业出版社 181页  提到了相关问题,给出的方案是:
“在打算组合的不同接口中使用相同的方法名通常会造成代码的可读性的混乱,请尽量避免这种情况!”
回复 使用道具 举报
interface A
{
        public abstract int getNum(int a);
}

interface B
{
        public final int num=4;
        public abstract String getNum(String str);
}

class C implements A,B
{

        /*public void  getNum()//方法根本就无法复写,不能确定到底是int 还是String
        {
                System.out.println();
        }
        */
       
}



class InterfaceDemo
{
        public static void main(String[] args)
        {
                C c=new C();
                c.getNum();
               
               
                //System.out.println("num"+num);
        }
}
回复 使用道具 举报
葛尧 中级黑马 2012-4-11 18:14:34
7#
编译这关都过不了吧(猜的)
首先接口之间的继承 也是继承关系,所以子接口中会继承出两个 返回类型不同的抽象"同名函数"。
当你定义的类 要实现这个子接口时,复写的方法 也会有这两个返回类型不同的"同名函数".
在被主调用者创建对象,调用方法时 不知道要用哪个      编译器混乱了,你自己看也会混乱的

比如 int test()    void test();
一个返回int 一个返回void
test();   你知道在调用哪一个吗?
回复 使用道具 举报
在我们实现接口的时候,复写接口的方法,如果子接口继承的多个父接口有相同的方法时。看你传入的参数和哪个函数相同,就是复写了哪个函数。复写和返回类型没有关系!
回复 使用道具 举报
实例化的过程和你初始化时传入的值类型有关,它会去找对应的构造函数进行实例化,这本身和你返回值类型没关系。但这样的类在编译时必然失败,因为你的子类在调用同名方法的时候根本无法明确返回的值是什么类型。
所以这样的方法不可能存在子父类中。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马