使用';或';在Java泛型声明中
我有一个方法返回使用';或';在Java泛型声明中,java,generics,collections,Java,Generics,Collections,我有一个方法返回 Map<String, List<Foo>> x(); Map<String, Collection<Foo>> y(); 我不确定你有什么问题。这段代码(本质上是您的代码)编译得很好 import java.util.*; public class Generic { static class Foo {}; static Map<String, List<Foo>> x() {
Map<String, List<Foo>> x();
Map<String, Collection<Foo>> y();
我不确定你有什么问题。这段代码(本质上是您的代码)编译得很好
import java.util.*;
public class Generic {
static class Foo {};
static Map<String, List<Foo>> x() {
return null;
}
static Map<String, Collection<Foo>> y() {
return null;
}
static Map<String, ? extends Collection<Foo>> myMap;
public static void main(String[] args) {
myMap = x();
myMap = y();
myMap = new HashMap<String,SortedSet<Foo>>();
for (Collection<Foo> value : myMap.values());
}
}
import java.util.*;
公共类泛型{
静态类Foo{};
静态映射x(){
返回null;
}
静态映射y(){
返回null;
}
静态地图myMap;
公共静态void main(字符串[]args){
myMap=x();
myMap=y();
myMap=newhashmap();
for(集合值:myMap.values());
}
}
但是,您不能执行类似于
List
的操作。Java泛型类型边界不是这样工作的。您使用的方式?扩展集合
可以。你不可能有这样或那样的东西,如果你有了,你就不知道如果你做了myMap.get(“someString”),你会得到什么;您不能执行List | Collection someVariable=myMap.get(“someString”)
,您必须选择一个,如果选择Collection,则与使用相同?扩展
,如果您选择List,那么如果映射中的对象实际上是一个集合(也是一个集合),而不是一个列表,并且您尝试调用只有List具有的方法(如indexOf),那么您将遇到各种各样的麻烦。至于您需要使用的原因?扩展
是因为即使列表扩展了集合,Map
也不会扩展Map
不过,您应该注意,使用
?extends Collection(扩展集合)
只允许您从映射中获取值,因为这样可以确定您获取的是一个集合(或集合的子集合),但如果您尝试在映射中放置某些内容,您将无法(因为myMap可能是Map
,但因为您只将其视为Map
,所以您可能会尝试在其中放入一个列表,这是不合适的)也可以使用JavaC1.6.0\u 17
进行编译。这是应该的。+1;另请参见
private Map<String, Collection<Foo> | List<Foo>>> myMap;
import java.util.*;
public class Generic {
static class Foo {};
static Map<String, List<Foo>> x() {
return null;
}
static Map<String, Collection<Foo>> y() {
return null;
}
static Map<String, ? extends Collection<Foo>> myMap;
public static void main(String[] args) {
myMap = x();
myMap = y();
myMap = new HashMap<String,SortedSet<Foo>>();
for (Collection<Foo> value : myMap.values());
}
}