Foo <! - ?,?,? - >不是Foo <! - ?,?,? - >

时间:2015-03-18 17:34:43

标签: 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 convert from Optional<Action<capture#31-of ?,capture#32-of ?,capture#33-of ?>> to Optional<Action<?,?,?>>
}

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

4 个答案:

答案 0 :(得分:4)

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

但是它没有在Java 7中编译,在那里我得到了编译器错误。

Java 8 has improved "target type" type inference

  

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

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

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

在Java 8中没有必要这样做,它可以在没有类型参数的情况下编译它。

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

答案 1 :(得分:0)

可能是混淆的类型推断。尝试

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

例如,你可以:

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

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