Generics Foo<&燃气轮机;isn';t Foo<&燃气轮机;

Generics Foo<&燃气轮机;isn';t Foo<&燃气轮机;,generics,java-7,guava,Generics,Java 7,Guava,我有一个非常简单的方法,我无法开始工作: private Map<UUID, Foo<?, ?, ?>> foos = new HashMap<UUID, Foo<?, ?, ?>>(); public Optional<Foo<?, ?, ?>> getFoo(UUID id){ return Optional.fromNullable(foos.get(id)); //Type mismatch: cannot

我有一个非常简单的方法,我无法开始工作:

private Map<UUID, Foo<?, ?, ?>> foos = new HashMap<UUID, Foo<?, ?, ?>>();

public Optional<Foo<?, ?, ?>> getFoo(UUID id){
    return Optional.fromNullable(foos.get(id)); //Type mismatch: cannot convert from Optional<Action<capture#31-of ?,capture#32-of ?,capture#33-of ?>> to Optional<Action<?,?,?>>
}
私有地图>();

public Optional>到Optional可能是类型推断变得混乱。试一试

Optional.<Foo<?, ?, ?>>fromNullable(foos.get(id))

可选。您可能必须使用
可选>
。“不同”有着不同的含义变得很奇怪,但这种方法通常是有效的。

您的代码是用Java 8编译的。(修订)

但它不是在Java7中编译的,在这里我得到了您的编译器错误

改进的类型推断-Java编译器利用目标类型推断泛型方法调用的类型参数。表达式的目标类型是Java编译器期望的数据类型,具体取决于表达式出现的位置。例如,您可以在JavaSE7中使用赋值语句的目标类型进行类型推断。但是,在JavaSE8中,可以在更多上下文中使用目标类型进行类型推断

要在Java 7中编译此文件,可以在
fromNullable
方法中插入类型参数

return Optional.<Foo<?, ?, ?>>fromNullable(foos.get(id));
返回可选。通配符对象(至少在Java 7中)不能修改,只能从中提取数据

例如,您可以:

 public void example( List<?> myList1, List<?> myList2 ){
    myList1.get(0); //this works
    myList1.add( myList2.get(0) );
 }
公共作废示例(列表myList1、列表myList2){
myList1.get(0);//这很有效
myList1.add(myList2.get(0));
}

那么,您调用的方法是否会在内部修改对象?

问题是,调用该方法时推断的类型可能与地图支持的类型不匹配。例如,您的映射可能有
Foo
,但是方法调用可能会推断它的泛型类型为
Foo
(有些不同)。您有两个不同的泛型声明。我有这个可怕的问题谢谢你!这正是问题所在。