這似乎是一個非常愚蠢的問題,但我不明白爲什麼這使用Optional<T>
編譯:Java:如何使用Optional.empty()編譯?
import java.util.Optional;
public class Driver {
static void foo(Optional<String> x) { }
public static void main() {
foo(Optional.empty());
}
}
Optional::empty
被定義爲返回我的Optional<T>
。在Driver::main
的內部,表達式Optional.empty()
好像會返回Optional<Object>
,因爲我沒有參數化使用Optional
,所以我期望它會回退到Object
作爲類型參數。然後,我將Optional<Object>
傳遞給一個函數,期望Optional<String>
,這是一個不應該被允許的參數向下。我期望看到類似於:
incompatible types: Optional<Object> cannot be converted to Optional<String>
但是,代碼編譯完美。顯然,我在這裏的思維過程是不正確的......但是在哪裏?
讓我在這裏澄清我在尋找答案...我知道什麼類型的推論。我不明白怎麼它這裏發生什麼在語言改變從Java 7到Java 8。例如,這段代碼在編譯的Java 8完美的罰款,但沒有在Java中7:
final class Opt<T> {
private final T value;
Opt(T x) {
value = x;
}
public static <T> Opt<T> empty() {
return new Opt<T>(null);
}
}
public class Driver {
static void bar(Opt<String> x) { }
public static void main() {
bar(Opt.empty());
}
}
這是如何工作在Java 8中,當你不得不處理像重載這樣的事情?有沒有關於這種事情的Java語言規範的特定部分?
類型推斷是一件很酷的事情 – 2014-09-30 20:33:21
這並不能有效回答這個問題。 – 2014-09-30 20:38:02