【发布时间】:2015-06-24 06:57:49
【问题描述】:
我很难为这个问题找到一个合适的标题,因为我观察到的现象很奇怪。因此,我跳过字面解释我的问题,而是向您展示一些(希望是)自描述代码。考虑以下参数化类:
public class GenericOptional<T> {
public GenericOptional(T someValue) {}
public T getValue() { return null; }
public Optional<String> getOptionalString() { return Optional.empty(); }
}
我想强调的是getOptionalString()方法的返回类型Optional<String>不依赖于类型参数T。
现在看看下面的代码,它是在 Eclipse Luna 4.4.2 中使用 Java 8u45 编译的:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional go = (GenericOptional) obj;
Optional os = go.getOptionalString();
}
局部变量os 的类型为Optional,没有类型参数 String! Eclipse 编译器丢失了关于固定type-parameter 的信息。有谁知道为什么?
现在看第二个代码示例:
public static void main(String[] args) {
Object obj = new GenericOptional<>(Boolean.TRUE);
GenericOptional<?> go = (GenericOptional) obj;
Optional<String> os = go.getOptionalString();
}
通过将局部变量go 声明为GenericOptional<?>,方法getOptionalString() 现在的返回类型正如预期的那样是Optional<String>。
谁能解释一下这种行为?
【问题讨论】:
标签: eclipse generics java-8 optional type-parameter