繁体   English   中英

富 <?, ?, ?> 不是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<?,?,?>>
}

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

您的代码在Java 8中编译。( Optional.fromNullable方法来自Guava )。

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

Java 8改进了“目标类型”类型推断

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

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

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

这在Java 8中是不必要的,Java 8可以在没有type参数的情况下编译它。

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

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

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

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

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

例如,您可以:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM