首先是简单的情况(A):
public class PsList implements List<Ps> { ... }
别处
private void doSomething(List<Ps> list) { ... }
// compiles
List<Ps> arrayList = new ArrayList<Ps>();
doSomething(arrayList);
// does not compile
PsList psList = new PsList();
doSomething(psList);
好的。我知道我可以通过添加 ? 将其更改为“工作” 延伸如下:
private void doSomething(? extends List<Ps> list) { ... }
// compiles
List<Ps> arrayList = new ArrayList<Ps>();
doSomething(arrayList);
// compiles
PsList psList = new PsList();
doSomething(psList);
我的问题是为什么我需要这样做?对我来说完全是无稽之谈。我正在实现所期望的确切界面。我可以传递除 ArrayList 之外的其他列表类型,为什么我的不行?
生活总是比这更复杂,所以我真正的编码问题是(B):
public class PsList implements List<Ps> { ... }
private void doSomething(Map<String, ? extends List<Ps>> map, Boolean custom) {
...
// need to create a new List<Ps> of either an ArrayList<Ps> or PsList
map.put("stringValue", custom ? new PsList() : new ArrayList<Ps>());
...
}
那么,无论哪种情况,Java都会抱怨map正在等待?扩展 List 作为值。
即使我将其更改为:
List<Ps> list = new ArrayList<>();
List<Ps> psList = new PsList();
map.put("string", custom ? psList : list);
当然这不能编译:
? extends List<Ps> list = new ArrayList<>();
? extends List<Ps> psList = new PsList();
map.put("string", custom ? psList : list);
那么我应该怎么做才能让这样的事情发挥作用呢?
编辑1:好的,最小的复制品:
Ps.java
package com.foo;
public class Ps
{
}
第一个参数类型错误。找到:'java.lang.String,com.foo.PsList>',必需:'java.util.Map>'
慕标琳琳
ABOUTYOU
相关分类