我正在尝试运行以下代码,由于类型推断,它在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)正常工作。
知道为什么吗?
答案 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
方法未返回预期的数组类型。