通配符和一个实现两个接口的类的问题

时间:2010-07-14 14:52:03

标签: java class interface wildcard

我有这个问题。
我有class UserImpl implements MyUser, YourUserclass UsersGetterImpl implements MyUsersGetter, YourUsersGetter。 我想在UsersGetterImpl内部实现一个返回的方法 List<MyUser> getUsers()的{​​{1}}和。{ MyUsersGetterinterface的{​​{1}},但我无法理解List<YourUser> getUsers()类中YourUsersGetterinterface的返回类型 - 可能它必须是带有通配符的内容(如{{ 1}},但不完全是,因为这个例子不起作用......)

2 个答案:

答案 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。

但是,如果两个接口都指定了相同的返回类型,那么您可以继续实现该方法。如果MyUserYourUser有共同的祖先,那么您可以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
      }
    }
  }