如何在 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>
.
这里的Req
、ExtReq
、ExtRes
、Res
这4个类型参数都是类型参数。记住这一点很重要,因为它们本身不是类型!
然后我们看派生接口的定义:ItemsProviderInterface<ExtReq, ExtRes>
只有2个类型参数:ExtReq
和ExtRes
。请注意,尽管名称相同,但它们本质上与基本界面上的名称没有任何关系。现在连接来了:
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类型为例
我是 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>
.
这里的Req
、ExtReq
、ExtRes
、Res
这4个类型参数都是类型参数。记住这一点很重要,因为它们本身不是类型!
然后我们看派生接口的定义:ItemsProviderInterface<ExtReq, ExtRes>
只有2个类型参数:ExtReq
和ExtRes
。请注意,尽管名称相同,但它们本质上与基本界面上的名称没有任何关系。现在连接来了:
interface ItemsProviderInterface<ExtReq, ExtRes>
extends GenericItemProviderInterface<ItemRequest, ExtReq, ExtRes, ItemResponse>
这意味着 ItemsProviderInterface
是一个 GenericProviderInterface
,其 4 个类型参数设置如下:
Req
ofGenericItemProviderInterface
设置为实际类型(class 或接口)ItemRequest
.ExtReq
设置为ItemsProviderItnerface
的类型参数ExtRes
设置为ItemsProviderInterface
的类型参数 Res
ofGenericItemProviderInterface
设置为实际类型ItemResponse
.
GenericItemProviderInterface
的ExtReq
GenericItemProviderInterface
的 ExtRes
因此 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类型为例