Foo<?, ?, ?> 不是 Foo<?, ?, ?>

Foo<?, ?, ?> isn't Foo<?, ?, ?>

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

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<?,?,?>>
}

这些怎么可能是不兼容的类型?我该如何解决这个问题?

可能是类型推断变得混乱了。尝试

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

您可能必须使用 Optional<? extends Foo<?, ?, ?>>。不同的 ? 具有不同的含义会变得很奇怪,但这种方法通常有效。

您的代码在 Java 8 中编译。(Optional.fromNullable method is from Guava)。

但它在 Java 7 中无法编译,在那里我得到了你的编译器错误。

Java 8 has improved "target type" type inference.

Improved Type Inference - The Java compiler takes advantage of target typing to infer the type parameters of a generic method invocation. The target type of an expression is the data type that the Java compiler expects depending on where the expression appears. For example, you can use an assignment statement's target type for type inference in Java SE 7. However, in Java SE 8, you can use the target type for type inference in more contexts.

要在 Java 7 中进行编译,您可以向 fromNullable 方法插入一个类型参数。

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

在Java 8中不需要这个,不需要类型参数就可以编译。

(如果你有Java8但没有Guava,你可以使用Java8的Optional.ofNullable方法)。

无法修改通配符对象(至少在 Java 7 中),您只能从中提取数据。

例如,您可以:

 public void example( List<?> myList1, List<?> myList2 ){
    myList1.get(0); //this works
    myList1.add( myList2.get(0) );
 }

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