Java 泛型接口转换

2022-09-02 05:28:33

我偶然发现了一个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


答案 1

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

不能对类执行此操作,因为 Java 可以在编译时检查是否可以将一个类强制转换为另一个类。

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


答案 2

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