带有通配符的Java泛型问题

带有通配符的Java泛型问题,java,generics,wildcard,Java,Generics,Wildcard,刚刚遇到一个我想使用泛型的地方,我不知道如何让它以我想要的方式工作 我的数据层中有一个方法,可以执行查询并返回对象列表。这是签名 public List getList(Class cls, Map query) 这就是我希望调用代码的样子 List<Whatever> list = getList(WhateverImpl.class, query); List List=getList(WhateverImpl.class,查询); 我想这样做,这样我就不必把它放到一个即将

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

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

public List getList(Class cls, Map query)
这就是我希望调用代码的样子

List<Whatever> list = getList(WhateverImpl.class, query);
List List=getList(WhateverImpl.class,查询);
我想这样做,这样我就不必把它放到一个即将出现的
列表中,这会导致我这样做

public <T> List<T> getList(Class<T> cls, Map query)
public List getList(类cls,映射查询)

但是现在我有一个问题,我得到的总是传入的具体的
列表
,而我希望它是
任何接口。我试着使用super关键字,但没能找到它。任何泛型专家都知道如何做到这一点?

您需要这样定义方法:

public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
public <T extends Whatever> List<? extends Whatever> get(Class<T> clazz, Map query) {
 return new ArrayList<T>(); // do whatever it is you do here to return a List<T>
}
public List getList(最终类cls,最终地图查询)

有什么理由不能这样做吗

public List<T> getList<T>(Map query)
公共列表getList(地图查询)

我认为唯一可行的方法是:

public <B, C extends B> List<B> getList(final Class<C> cls, final Map<?, ?> query)
public <T extends Whatever> List<? extends Whatever> get(Class<T> clazz, Map query) {
 return new ArrayList<T>(); // do whatever it is you do here to return a List<T>
}

public list它在任何方面都不是类型安全的,除非您正在执行一些黑暗、黑暗的魔法,否则您通常需要在运行时为此类操作提供一些类型信息。它也不会编译。虽然我不同意像这样的签名需要黑魔法才能有效使用。例如,将“getList”更改为“createList”,将“query”更改为“properties”,您可能会有一个智能工厂方法,根据map
(map.put(MapProperties.INSERTION\u COMPLEXITY,new BigO(1)))中的属性创建一个列表。
有人吗?@MarkPeters:让我澄清一下:这需要黑暗,暗魔法以类型安全的方式实现;-)您是说这不是类型安全的:
公共列表getList(映射查询){returnnewarraylist();}
?那么
Collections.emptyList()
呢,它也不是类型安全的?(啊,我把它作为emptyList取回,因为它传回一个单例,导致未经检查的强制转换…这可能就是你所说的黑魔法。)返回类型
List
是什么意思?@Deadlus:返回类型就是
List
是类型参数,它们表示“此方法采用两个类型参数,
B
C
,其中
C
必须是
B
的某个子类型。通常在调用方法时不需要显式指定这些类型参数,因为它们可以从上下文中推断出来(但是,有时有必要指定它们)@Sean:Eclipse编译得很好,但是OpenJDK中的
javac
抱怨道:-/在过去,当我遇到这样的问题时,通常是Eclipse编译器更正确,但这有什么用呢…@MarkPeters:一旦有必要,您可以完全去掉第二个类型参数,只使用
List getList(Class@Andrei不,他不想创建一个列表。我不知道你从哪里得到的。他的列表中的所有元素可能都是WhateverImpls,但这并不意味着他必须创建一个列表。
List是的,我知道。但是它允许你以
任何形式获取元素,这就是我想要的需要思考。无论如何,我意识到我不太明白询问者想要什么。