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

时间:2016-01-11 17:28:20

标签: java generics types java-8 type-inference

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

input

我是否真的需要将MyClass定义并实例化为public class MyClass<T extends List<P>> { T getList(/**/){} P getRandomElement(){ /**/ } } ,无论如何都无法推断出来?

编辑:我的意思是我看到多余的必须定义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()时会返回String

1 个答案:

答案 0 :(得分:5)

如果您确实必须从List返回getList的确切类型,那么您需要类型参数T以及P

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

通过这种方式,您可以MyClass<String, ArrayList<String>> getList方法返回ArrayList<String>getRandomElement方法返回String

但是,通常不必知道List的确切类型。通常情况下,如果您有List,那么对于此类的用户而言,List实际上是哪种类型并不重要。在这种情况下,您不需要类型参数T,只需要P。您可以将课程更改为:

public class MyClass<P> {
   List<P> getList(/**/){}
   P getRandomElement(){ /**/ }
}

然后,您可以MyClass<String> getList方法返回List<String>getRandomElement方法返回String