如何在 Java 中实现扩展另一个通用接口的通用接口?

How to implement a generic interface that extends another generic interface in Java?

我是 Java 的新手,正在致力于实现通用接口,这正是我需要帮助的地方。

我想在 Java 中实现一个扩展另一个接口的通用接口。这是当前界面结构的样子 -

interface ItemsProviderInterface<ExtReq, ExtRes> 
extends GenericItemProviderInterface<ItemRequest, ExtReq, ExtRes, ItemResponse> {}


interface GenericItemProviderInterface<Req, ExtReq, ExtRes, Res>{
    ExtReq convertInput(Req req)
    Res convertResponse(ExtRes res)
    ExtRes request(ExtReq req)
}

我想实现 ItemsProviderInterface 接口并提供 convertInput(), convertResponse(), request() 方法的定义。

可能是 -

class itemsProvider<> implements ItemsProviderInterface<>

我不确定用哪个通用类型来定义 class...对应于 ItemsProviderInterface 或 GenericItemProviderInterface 的那些。我阅读了很多博客文章并在 Whosebug 上搜索了类似的问题,但找不到。非常感谢任何帮助。

I am not sure which generic type to define the class with.. the ones corresponding to ItemsProviderInterface or GenericItemProviderInterface.

Class ItemsProvider 直接实现了 ItemsProviderInterface,因此它必须为该接口定义的参数指定值。该接口(它忠实地履行)有责任定义适用于其 GenericItemProviderInterface.

扩展的参数

这在语义上可能有点晦涩难懂,但在句法上是明确无误的,尤其是在子接口和超接口具有不同数量的参数的情况下。您在此 implements 子句中放在尖括号之间的参数值 ...

implements ItemsProviderInterface<>

... 是子句中命名的接口的参数。如果您尝试提供错误的数量,那么编译器将拒绝您的代码。

我认为值得检查在这种情况下哪个标识符意味着什么。先看基础界面GenericItemProviderInterface<Req, ExtReq, ExtRes, Res>.

这里的ReqExtReqExtResRes这4个类型参数都是类型参数。记住这一点很重要,因为它们本身不是类型!

然后我们看派生接口的定义:ItemsProviderInterface<ExtReq, ExtRes>只有2个类型参数:ExtReqExtRes。请注意,尽管名称相同,但它们本质上与基本界面上的名称没有任何关系。现在连接来了:

interface ItemsProviderInterface<ExtReq, ExtRes> 
extends GenericItemProviderInterface<ItemRequest, ExtReq, ExtRes, ItemResponse> 

这意味着 ItemsProviderInterface 是一个 GenericProviderInterface,其 4 个类型参数设置如下:

  • Req of GenericItemProviderInterface 设置为实际类型(class 或接口)ItemRequest.
  • GenericItemProviderInterface
  • ExtReq设置为ItemsProviderItnerface
  • 的类型参数ExtReq GenericItemProviderInterface
  • ExtRes 设置为 ItemsProviderInterface
  • 的类型参数 ExtRes
  • Res of GenericItemProviderInterface 设置为实际类型 ItemResponse.

因此 base-class 的 4 个类型参数中有 2 个“固定”为特定类型,其余两个为变量。

如果你现在实现 ItemProviderInterface 你可以 或者 也有 2 个类型参数并将它们路由到 ExtReq/ExtRes 将它们修复为特定的 classes(或做 1-and-1,但这可能对这个特定示例没有用。

所以要么

class MyItemProvider<ExtReq, ExtRes>
    implements ItemProviderInterface<ExtReq, ExtRes> {...}

class MySpecificItemProvider
    implements ItemProviderInterface<MySpecificExtReq, MySpecificExtRes> {...}

在您的用例中,class itemsProvider 正在实现 ItemsProviderInterface,因此 class 应该只正在处理实现接口所包含的泛型类型。

在这个class中你要实现的方法,有两种方式。既然你说你想提供方法的实现,我认为你需要方法上的特定 return 类型。在那种情况下,你可以着手做这个

public class itemsProvider<String, Integer> implements ItemsProviderInterface<String, Integer> {

这里我以ExtReq和ExtRes在调用时分别是String和Integer类型为例