簡體   English   中英

Java泛型泛型類型參數和Optionals的奇怪編譯錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM