【问题标题】:How to override generic method java [duplicate]如何覆盖泛型方法java [重复]
【发布时间】:2016-08-16 08:46:52
【问题描述】:

我有一个只包含一个通用方法的接口:

public interface Presenter {
    <T> void query(T queryParameter);
}

现在,我想定义Presenter 的子类,并且我希望类型为String,就像这样:

public class IpQueryPresenter implements Presenter {
    void query(String queryParameter) {
         //do something here...
    }
}

如何定义?

我看到你所有的答案都在接口名称上定义了类型,但这是必须的吗?如果我只想定义一个泛型方法并覆盖它,是否有可能?

【问题讨论】:

  • 顺便说一句,“我有一堂课……”不正确,Presenter 是一个接口 :)
  • 在您的示例中,IpQueryPresenter 不是Presenter(或其他任何东西)的子类; Presenter 也是一个接口,而不是一个类。
  • 感谢您的提示,我已经修改了问题。

标签: java generics


【解决方案1】:

首先,根据您的代码,我假设您正在实现一个接口,而不是扩展一个类(尽管您的 IpQueryPresenter 类既没有 extendsimplements 子句)。

您可以将泛型类型参数移动到接口级别:

public interface Presenter<T> {
    void query(T queryParameter);
}

然后:

public class IpQueryPresenter implements Presenter<String> {
    void query(String queryParameter) {
         //do something here...
    }
}

【讨论】:

    【解决方案2】:

    使接口本身通用并在子类中定义您的类型

    public interface Presenter<T> {
        void query(T queryParameter);
    }
    
    public class IpQueryPresenter implements Presenter<String>  {
        void query(String queryParameter) {
             //do something here...
        }
    }
    

    【讨论】:

      【解决方案3】:

      在界面上定义T,即这样:

      public interface Presenter<T> {
       void query(T queryParameter);
      }
      

      然后在实现中设置类型:

      public class IpQueryPresenter implements Presenter<String> {
        //note that you need to make the method public
        public void query(String queryParameter) {
           //do something here...
        }
      }
      

      【讨论】:

      • 感谢您的评论和回答,但我仍然想知道是否可以在界面上不定义T 的情况下做到这一点?
      • @L.Swifter 这实际上没有意义,因为在方法上定义 T 意味着您想从赋值或参数中推断类型。另外考虑对像Presenter p 这样的变量进行操作。编译器应该如何知道该接口的某个实现只允许字符串(您认为它为什么要打扰)?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多