实践中遇到的一个问题,实在搞不懂,特来请教各位。
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已经被实现了吗?接口继承接口可以存在重写吗?还是因为泛型导致这种问题?这是怎么一回事,请各位明示。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
在你的例子中, 如果你只是实现了
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);,那么子类此时的代码就相当于:而
SubClass的父类HeAbstract也有一个public Serializable get(Serializable id);方法,冲突了。从你的描述上来看
get并没有实现。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个定义一模一样的接口方法,只需要实现一个
例如
实际上,在接口继承并指定泛型参数时,完全可以不用再定义方法