我偶然发现了一个涉及泛型和接口的Java构建情况,我不明白.
请在我创建的地方考虑以下代码List<Interface1>.然后get()是一个元素并将其转换为Interface2没有编译器错误,尽管这两个接口完全不相关.
import java.util.*;
public class Main {
public static void main(String ... args) {
List<Interface1> list = new ArrayList<>();
list.add(new Interface1() {});
Interface1 ok = list.get(0);
Interface2 why = (Interface2)list.get(0);
}
}
interface Interface1 {
}
interface Interface2 {
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释为什么第二个演员阵容没有编译器错误get(0)?
两个附注:执行该类会抛出一个ClassCastException(如预期的那样).使用两个类而不是接口确实会产生编译错误.
我找到了一段代码,从Java 7切换到Java 8后停止编译.它没有任何新的Java 8内容,如lambda或流.
我将有问题的代码缩小到以下情况:
GenericData<Double> g = new GenericData<>(1d);
Double d = g == null ? 0 : g.getData(); // type error!!!
Run Code Online (Sandbox Code Playgroud)
您可能猜测GenericData构造函数有一个泛型类型的参数,该getData()方法只返回该泛型类型.(有关完整的源代码,请参阅下文.)
现在困扰我的是,在Java 7中,代码编译得很好,而使用Java 8,我得到以下错误:
CompileMe.java:20: error: incompatible types: bad type in conditional expression
Double d = g == null ? 0 : g.getData();
^
int cannot be converted to Double
Run Code Online (Sandbox Code Playgroud)
似乎Java 7能够从int - > double - > Double进行转换,但Java 8因尝试立即从int - > Double而失败.
我觉得特别有趣的是Java 8 确实接受代码时,我改变它getData()到data,即访问GenericData通过变量本身而不是消气方法的价值:
Double …Run Code Online (Sandbox Code Playgroud)