如何在 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.