JDK8类型推断问题

时间:2016-08-18 15:20:11

标签: java-8 javac classcastexception type-inference

我正在尝试运行以下代码,由于类型推断,它在JDK8下编译得很好:

public static <A,B> B convert(A a) {
  return (B) new CB();
}
public static void main(String[] args) {
  CA a = new CA();
  CB b = convert(a); //this runs fine
  List<CB> bl = Arrays.asList(b); //this also runs fine
  List<CB> bl1 = Arrays.asList(convert(a)); //ClassCastException here
}

但是,运行此抛出ClassCastException:CB不能转换为[Ljava.lang.Object,但CB b = convert(a)正常工作。

知道为什么吗?

1 个答案:

答案 0 :(得分:3)

每当你创建一个带有签名的泛型方法,该签名都承诺返回调用者所希望的内容时,你就会遇到麻烦。你应该从编译器得到一个“未经检查”的警告,这基本上意味着:可能会发生意外的ClassCastException

您希望编译器推断

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB>convert(a));

而编译器实际推断

List<CB> bl1 = Arrays.asList(YourClass.<CA,CB[]>convert(a));

据我所知,因为它更喜欢不需要varargs打包的方法调用(它与pre-varargs代码兼容)。

此操作失败,因为您的convert方法未返回预期的数组类型。