[英]Java weird compilation error with raw generic type parameter and Optionals
以下Java代碼無法編譯(使用javac 1.8.0_121
)
import java.util.Optional;
class B<T> {}
public class Test {
static B<Integer> f1(B<Object> a) { return null; }
static B<Integer> f2() {
Optional<B> opt = Optional.empty(); // note the raw type B
return opt.map(Test::f1).get();
// error: incompatible types: Object cannot be converted to B<Integer>
}
}
我的問題是:為什么代碼不能像上面那樣編譯,如果我改變f1
來獲取原始類型,為什么它會編譯:
static B<Integer> f1(B a) { return null; } // program compiles with raw B
我的猜測是opt.map
被推斷為返回Optional<Object>
(而不是Optional<B<Integer>>
),但為什么呢? 我已經查看了泛型和類型擦除(JLS 4.8)的其他問題,但它們都處理了在原始類型本身上調用方法時的情況(例如, 這 )。 這里, opt
不是原始的,它只需要一個原始類型參數。 另外,為什么第二個版本(參數a
是原始B
而不是B<Object>
)有效?
編譯錯誤消息
Error java: incompatible types: java.lang.Object cannot be converted to B<java.lang.Integer>
讓f1使用? extends Object
? extends Object
,向B
添加通配符類型。
import java.util.Optional;
class B<T> {}
public class Test {
static B<Integer> f1(B<? extends Object> a) { return null; }
static B<Integer> f2() {
Optional<B<?>> opt = Optional.empty(); // note the raw type B
return opt.map(x -> f1(x)).get();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.