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 {
}

任何人都可以解释为什么在第二个get(0)中没有编译错误的演员?

两个注释:执行该类会引发ClassCastException(如预期的那样)。并且使用两个类而不是接口确实生成编译错误。

这种行为与泛型无关:您可以将任何接口投射到任何其他接口,而无需编译错误。

你不能这样做,因为Java可以在编译时检查一个类是否可以被转换到另一个类。

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

http://stackoverflow.com/questions/22631979/java-generics-interface-casting

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java泛型界面投射