带有通配符的Java泛型问题

Sea*_*ean 5 java generics wildcard

刚遇到一个我想使用泛型的地方,我不知道如何让它按照我想要的方式工作.

我的数据层中有一个方法来执行查询并返回一个对象列表.这是签名.

public List getList(Class cls, Map query)
Run Code Online (Sandbox Code Playgroud)

这就是我想要的调用代码.

List<Whatever> list = getList(WhateverImpl.class, query);
Run Code Online (Sandbox Code Playgroud)

我想做到这一点,以便我不必将其投射到一个List<Whatever>出来,这导致我这样做.

public <T> List<T> getList(Class<T> cls, Map query)
Run Code Online (Sandbox Code Playgroud)

但是现在我遇到的问题是,我得到的东西总是具体List<WhateverImpl>传入,而我希望它是Whatever界面.我试图使用super关键字,但无法弄明白.那里的任何仿制药大师都知道如何做到这一点?

Joa*_*uer 8

你需要像这样定义方法:

public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
Run Code Online (Sandbox Code Playgroud)

  • @MarkPeters:一旦有必要,你可以完全摆脱第二种类型的参数,只需使用`<C> List <C> getList(Class <?extends C> cls)`并将其称为`this.getList <Whatever> (WhateverImpl.class)`. (3认同)