我有一个非常简单的方法,我无法开始工作:
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<?,?,?>>
}
这些是不兼容的类型怎么样?我该如何解决这个问题?
答案 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) );
}
那么,您调用的方法是否可以在内部修改对象?