【问题标题】:problem with wildcards and one class which implements two interfaces通配符和一个实现两个接口的类的问题
【发布时间】:2010-07-14 14:52:03
【问题描述】:

我有这个问题。
我有class UserImpl implements MyUser, YourUserclass UsersGetterImpl implements MyUsersGetter, YourUsersGetter。 我想在UsersGetterImpl 中实现一个方法,它返回 List<MyUser> getUsers() 代表 MyUsersGetterinterface,以及 List<YourUser> getUsers() 代表 YourUsersGetterinterface,但我无法理解 getUsers()UsersGetterImpl 类中的返回类型 - 可能它必须是带有通配符的东西(比如 List<? extends UserImpl> getUsers(),但不完全是,因为这个示例不起作用...)

【问题讨论】:

    标签: java class interface wildcard


    【解决方案1】:

    很难说出你在问什么,但根据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; }
    }
    

    不可能声明一个名为 getNumberOfScales 的方法,其签名和返回类型与接口 Fish 和接口 StringBass 中声明的方法的签名和返回类型相同,因为一个类只能有一个具有给定签名的方法 ( §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(); }
    

    【讨论】:

    • 是的,但是你可以这样做: interface MyUser{} interface YourUser{} class UserImpl implements MyUser, YourUser {} interface MyUserGetter{ MyUser getUser();} interface YourUserGetter{ YourUser getUser();}类 UserGetterImpl 实现 MyUserGetter,YourUserGetter { public UserImpl getUser() { return new UserImpl();我想在 MyUserGetter 接口中添加方法 List getUsers() ,在 YourUserGetter 接口中添加 List getUsers() ,并且在 UserGetterImpl 中添加唯一的实现 List????> getUsers() 跨度>
    【解决方案2】:

    简短的回答是:无法做到。您不能有两个签名仅因返回类型不同而不同的方法,因此您不能让一个类实现两个定义仅因返回类型不同的方法的接口。

    简单的解决方法是让 MyUsersGetter 和 YourUsersGetter 具有不同名称的方法。

    一种可能的解决方法是让 UsersGetterImpl 不直接实现 MyUsersGetter 和 YourUsersGetter,而是让委托:

    class UsersGetterImpl {
      public MyUsersGetter getMyUsers () {
        return new MyUsersGetter () {
          public List<MyUsers> getUsers () {
            //do stuff here
          }
        }
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 2010-11-20
      • 2023-03-06
      • 2011-01-22
      相关资源
      最近更新 更多