这似乎是一个非常愚蠢的问题,但我无法理解为什么使用Optional< T>编译:
import java.util.Optional;
public class Driver {
static void foo(Optional 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 cannot be converted to Optional
但是,代码编译完全正常.显然,我的思维过程不正确……但在哪里?
让我在这里的答案中澄清我正在寻找的内容……我知道什么是类型推断.我不明白它是如何发生的,以及从Java 7到Java 8的语言发生了什么变化.例如,这些代码在Java 8中编译得非常好,但在Java 7中失败了:
final class Opt {
private final T value;
Opt(T x) {
value = x;
}
public static Opt empty() {
return new Opt(null);
}
}
public class Driver {
static void bar(Opt x) { }
public static void main() {
bar(Opt.empty());
}
}
当你必须处理重载等事情时,它如何在Java 8中工作?是否有Java语言规范的特定部分讨论这种事情?