Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用';或';在Java泛型声明中_Java_Generics_Collections - Fatal编程技术网

使用';或';在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());
    }
}