Java泛型接口转换

Quo*_*ota 20 java generics casting interface

我偶然发现了一个涉及泛型和接口的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(如预期的那样).使用两个类而不是接口确实会产生编译错误.

Fla*_*vio 29

此行为与泛型无关:您可以将任何接口转换为任何其他接口而不会出现编译错误.

您无法对类执行此操作,因为Java可以在编译时检查是否可以将一个类转换为另一个类.

但是使用接口,强制转换可能成功或失败,具体取决于实际实现接口的类.这只能在运行时发现.


Har*_*ezz 8

如果你有一个实现Interface1它的类型也可以实现Interface2.因此编译器不会责怪你,因为在运行时,强制转换可能会成功.