一道Java关于接口、继承和重写的基础问题
PHP中文网
PHP中文网 2017-04-18 10:15:12
[Java讨论组]

实践中遇到的一个问题,实在搞不懂,特来请教各位。
1.首先有一个接口,接口里有一个get方法。

public interface HeInterface <T extends Serializable, PK extends Serializable> {
    public T get(PK id);
}

2.其次有一个类,实现了接口的get方法。

public abstract class HeAbstract <T extends Serializable, PK extends Serializable> implements IBaseDao<T, PK>{
    @Override
    public T get(PK id) {
        if(id==null)return null;
        return (T) getCurrentSession().get(entityClass, id);
    }
}  

3.然后我写了一个接口,继承了HeInterface这个接口,并且也有一个get方法。

public interface MyInterface extends HeInterface<ClassA, String>{
    public ClassA get(String id);
}

4.最后我写了一个实现类,实现我的接口,但是发现IDE的添加未实现的方法没有提示get方法为未实现,意思是我的get已经被实现了吗?接口继承接口可以存在重写吗?还是因为泛型导致这种问题?这是怎么一回事,请各位明示。

PHP中文网
PHP中文网

认证0级讲师

全部回复(3)
大家讲道理

在你的例子中, 如果你只是实现了MyInterface接口没有继承HeAbstract类的话,那么get方法你是没有实现的,IDE如果没有提示你,要么你使用姿势有错, 要么IDE出bug了。
而如果你的实现类如果继承自HeAbstract类,而且还实现了MyInterface接口,那么应该是不能编译通过的。
首先要明确Java中是不能有两个相同的方法,要么参数列表不同,要么方法名不同。
如果你的子类实现了MyInterface,那它就应该有一个public ClassA get(String id)方法。
同时你的子类还继承了HeAbstract类,那么它就还可以调用父类的public Serializable get(Serializable id)方法。
这样的一个类本身是没问题的,因为子类的get方法和父类的get方法参数不同。
但是在你的代码中, 因为MyInterface又继承自HeInterface,那么就有问题了, 因为HeInterface中定义的方法是public Serializable get(Serializable id);,那么子类此时的代码就相当于:

class SubClass ... {
    public Serializable get(String id);
    
    public Serializable get(Serializable id);
}

SubClass的父类HeAbstract也有一个public Serializable get(Serializable id);方法,冲突了。

怪我咯

从你的描述上来看get并没有实现。

伊谢尔伦
public interface HeInterface <T extends Serializable, PK extends Serializable>

public interface MyInterface extends HeInterface<ClassA, String>

MyInterface 相当于把HeInterface里的泛型参数具体化了
T=ClassA
PK=String

相应的,HeInterface接口里的方法
public T get(PK id);
就变成了
public ClassA get(String id);

这个方法与MyInterface里重新定义的方法
public ClassA get(String id);
一模一样

对于IDE和编译器来说,2个定义一模一样的接口方法,只需要实现一个

例如

public interface A() {
    public void function();
}
public interface B() {
    public void function();
}

class Impl implements A, B {
    public void function() {
        //do something
        //这里即是A接口的实现,也是B接口的实现
    }
}

实际上,在接口继承并指定泛型参数时,完全可以不用再定义方法

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号