[英]Is there a technical reason why the implementation isn't just impl Foo<T>?
[英]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编译器利用目标类型来推断泛型方法调用的类型参数。 表达式的目标类型是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.