我有这个问题。
我有class UserImpl implements MyUser, YourUser
和class UsersGetterImpl implements MyUsersGetter, YourUsersGetter
。
我想在UsersGetterImpl
内部实现一个返回的方法
List<MyUser> getUsers()
的{{1}}和。{
MyUsersGetterinterface
的{{1}},但我无法理解List<YourUser> getUsers()
类中YourUsersGetterinterface
的返回类型 - 可能它必须是带有通配符的内容(如{{ 1}},但不完全是,因为这个例子不起作用......)
答案 0 :(得分:2)
很难说出你在问什么,但根据Java Language Specification:
在这种情况下:
interface Fish { int getNumberOfScales(); }
interface StringBass { double getNumberOfScales(); }
class Bass implements Fish, StringBass {
// This declaration cannot be correct, no matter what type is used.
public ??? getNumberOfScales() { return 91; }
}
使用与接口Fish和接口StringBass中声明的方法相同的签名和返回类型声明一个名为getNumberOfScales的方法是不可能的,因为一个类只能有一个具有给定签名的方法( 8.4节)。因此,单个类不可能同时实现接口Fish和接口StringBass。
但是,如果两个接口都指定了相同的返回类型,那么您可以继续实现该方法。如果MyUser
和YourUser
有共同的祖先,那么您可以List<? extends User>
,或者如果它们没有共性,您只需使用List<?>.
但是,在那时,你必须停下来考虑一下你真正想要的常见实现。如果您向我们提供了有关您问题的更多详细信息,我怀疑可能会有更优雅的解决方案。
修改
根据您的评论,您需要类似......
的内容interface MyUserGetter { List<? extends MyUser> getUsers(); }
interface YourUserGetter { List<? extends YourUser> getUsers(); }
class UserGetterImpl { List<? extends UserImpl> getUsers(); }
这是未经测试的,我估计有50%的工作机会。
架构建议是,您可能实际上需要两个接口的两个实现,而不是单个实现两个接口:
interface User {}
class MyUser implements User {}
class YourUser implements User {}
interface UserGetter { List<? extends User> getUsers(); }
答案 1 :(得分:1)
简短的回答是:它无法完成。你不能有两个方法,它们的签名只有返回类型不同,因此你不能让一个类实现两个接口来定义只有返回类型不同的方法。
简单的解决方法是让MyUsersGetter和YourUsersGetter拥有不同名称的方法。
一种可能的解决方法是让UsersGetterImpl不直接实现MyUsersGetter和YourUsersGetter,但要拥有代理:
class UsersGetterImpl {
public MyUsersGetter getMyUsers () {
return new MyUsersGetter () {
public List<MyUsers> getUsers () {
//do stuff here
}
}
}