Это кажется очень глупый вопрос, но я не могу понять, почему это использование 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, который говорит об этом?
Тип вывода - это классная вещь –
Это не отвечает на вопрос полезным. –