이 정말 바보 같은 질문처럼 보이지만이 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
의 사용을 매개 변수화하지 않으므로 Optional<Object>
을 반환하는 것처럼 보입니다. 따라서 형식 매개 변수로 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 언어 스펙의 특정 섹션이 있습니까?
유형 유추는 멋진 것이다 –
그 질문에 유용하게 대답하지 않는다. –