【问题标题】:Java generics in an interface接口中的 Java 泛型
【发布时间】:2012-02-21 00:44:17
【问题描述】:

我在 Java 中遇到了泛型问题,我在网上找不到以类似方式使用泛型的人的解决方案或示例。我有一组位于相同请求/响应结构中的方法。例如,用户填充 Request 对象中的字段,将该对象传递给辅助方法,然后返回一个 Response 对象。我所有的请求对象都从一个通用的 Request 超类扩展而来(类似地,来自 Response 超类的 Response 对象)。我希望我的助手类也有一个一致的结构,所以我使用了一个接口。这里有一些代码来说明......

请求超类:

public class SuperRequest {
    // ...
}

示例请求子类:

public class SubRequest extends SuperRequest {
    // ...
}

响应超类:

public class SuperResponse {
    // ...
}

示例响应子类:

public class SubResponse extends SuperResponse{
    // ...
}

界面:

public interface SomeInterface {
    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request);
}

从界面中可以看出,我想传递一个对象,它是SuperRequest 的子对象,我想返回一个对象,它是SuperResponse 的子对象。这是我的实现:

public class SomeImplementation implements SomeInterface {

    @Override
    public SubResponse someMethod(SubRequest request) {
        return null;
    }
}

在 Eclipse 中,我收到编译错误,因为编译器告诉我我有未实现的方法,并且 @Override 表示法“不会覆盖超类型方法”。

有人可以帮我吗?我的语法不正确还是我对泛型的理解有点偏离?非常感谢任何帮助!

【问题讨论】:

    标签: java generics interface


    【解决方案1】:

    尝试将您的接口和实现更改为:

    interface SomeInterface<T extends SuperRequest, U extends SuperResponse> {
        public U someMethod(T request);
    }
    
    class SomeImplementation implements SomeInterface<SubRequest, SubResponse> {
    
        @Override
        public SubResponse someMethod(SubRequest request) {
            return null;
        }
    }
    

    【讨论】:

    • 太棒了!我有一种感觉,我对语法/声明有点偏离。感谢您的帮助!
    【解决方案2】:

    目前SomeInterface的实现必须实现参数化方法,即:

    public <T extends SuperRequest, U extends SuperResponse> U someMethod(T request);
    

    它不能选择一个特定的子类来代替TU

    接口本身必须是通用的SomeInterface&lt;T extends SuperRequest, U extends SuperResponse&gt;,然后子类可以为TU选择具体的实现。

    【讨论】:

      【解决方案3】:

      在实现接口时还必须声明类型。试试这个:

      public class SomeImplementation implements SomeInterface<SubRequest,SubResponse> {
      
          @Override
          public SubResponse someMethod(SubRequest request) {
              return null;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多