小编Quo*_*ota的帖子

Java泛型接口转换

我偶然发现了一个涉及泛型和接口的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 generics casting interface

20
推荐指数
2
解决办法
2645
查看次数

Java 8 autoboxing +泛型:变量与方法的不同行为

我找到了一段代码,从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)

java generics autoboxing java-8

17
推荐指数
3
解决办法
1107
查看次数

标签 统计

generics ×2

java ×2

autoboxing ×1

casting ×1

interface ×1

java-8 ×1