如何在类定义中捕获泛型类型中的子类型?

Whi*_*cal 1 java generics types type-inference java-8

我不敢相信如果没有将类输入到冗余的2类类中,我就无法捕获P:

public class MyClass<T extends List<P>> {

   T getList(/**/){}
   P getRandomElement(){ /**/ }
}
Run Code Online (Sandbox Code Playgroud)

我是否真的需要定义和实例化MyClass MyClass<String,ArrayList<String>>,因此无法推断它?

编辑:我的意思是我看到冗余必须定义MyClass<P,T extends List<P>>因为那时我需要实例化它总是作为MyClass<String,ArrayList<String>>,并随身携带字符串.如果语言允许这样的话会很好

MyClass<L extends List<P>>或类似的.这样,在执行时和MyClass<ArrayList<String>>返回ArrayList<String>执行时会很好地返回.getList()StringgetRandomElement()

rge*_*man 5

如果你真的必须有确切的List返回类型getList,那么你需要type参数T以及P.

public class MyClass<P, T extends List<P>> {
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用MyClass<String, ArrayList<String>>getList方法返回的方法和返回a ArrayList<String>getRandomElement方法String.

但是,通常不需要知道确切的类型List.通常,如果你有一个List,那么对于这个类的用户来说这List是真的是什么并不重要.在这种情况下,你不需要类型参数T,只P.您可以将课程更改为:

public class MyClass<P> {
   List<P> getList(/**/){}
   P getRandomElement(){ /**/ }
}
Run Code Online (Sandbox Code Playgroud)

然后你就可以有MyClass<String>getList方法返回一个List<String>getRandomElement返回的方法String.

  • 为什么这个解决方案多余? (2认同)