如何在 class 定义中的泛型类型中捕获子类型?
How can I capture a subtype within a generic type in a class definition?
我不敢相信如果不将 class 键入冗余的 2 类型 class 我就无法捕获 P:
public class MyClass<T extends List<P>> {
T getList(/**/){}
P getRandomElement(){ /**/ }
}
我真的需要将 MyClass 定义并实例化为 MyClass<String,ArrayList<String>>
,难道不能以某种方式推断出来吗?
编辑:我的意思是我认为必须定义 MyClass<P,T extends List<P>>
是多余的,因为那时我需要始终将其实例化为 MyClass<String,ArrayList<String>>
,并在任何地方携带字符串。如果语言允许
MyClass<L extends List<P>>
或类似的东西,那就太好了。这样,MyClass<ArrayList<String>>
在执行 getList()
时会 return 一个 ArrayList<String>
,在执行 getRandomElement()
时一个 String
,很好。
如果您确实必须从 getList
返回 List
的确切类型,那么您需要类型参数 T
以及 P
.
public class MyClass<P, T extends List<P>> {
这样你可以有一个 MyClass<String, ArrayList<String>>
其 getList
方法 returns 一个 ArrayList<String>
和一个 getRandomElement
方法 returns String
.
然而,通常不需要知道 List
的确切类型。通常,如果您有一个 List
,那么对于这个 class 的用户来说,实际上是哪种 List
并不重要。在这种情况下,您不需要类型参数 T
,只需要 P
。您可以将 class 更改为:
public class MyClass<P> {
List<P> getList(/**/){}
P getRandomElement(){ /**/ }
}
然后你可以有一个 MyClass<String>
其 getList
方法 returns 一个 List<String>
和一个 getRandomElement
方法 returns 一个 String
.
我不敢相信如果不将 class 键入冗余的 2 类型 class 我就无法捕获 P:
public class MyClass<T extends List<P>> {
T getList(/**/){}
P getRandomElement(){ /**/ }
}
我真的需要将 MyClass 定义并实例化为 MyClass<String,ArrayList<String>>
,难道不能以某种方式推断出来吗?
编辑:我的意思是我认为必须定义 MyClass<P,T extends List<P>>
是多余的,因为那时我需要始终将其实例化为 MyClass<String,ArrayList<String>>
,并在任何地方携带字符串。如果语言允许
MyClass<L extends List<P>>
或类似的东西,那就太好了。这样,MyClass<ArrayList<String>>
在执行 getList()
时会 return 一个 ArrayList<String>
,在执行 getRandomElement()
时一个 String
,很好。
如果您确实必须从 getList
返回 List
的确切类型,那么您需要类型参数 T
以及 P
.
public class MyClass<P, T extends List<P>> {
这样你可以有一个 MyClass<String, ArrayList<String>>
其 getList
方法 returns 一个 ArrayList<String>
和一个 getRandomElement
方法 returns String
.
然而,通常不需要知道 List
的确切类型。通常,如果您有一个 List
,那么对于这个 class 的用户来说,实际上是哪种 List
并不重要。在这种情况下,您不需要类型参数 T
,只需要 P
。您可以将 class 更改为:
public class MyClass<P> {
List<P> getList(/**/){}
P getRandomElement(){ /**/ }
}
然后你可以有一个 MyClass<String>
其 getList
方法 returns 一个 List<String>
和一个 getRandomElement
方法 returns 一个 String
.