java中的奇怪ClassCastException

时间:2018-01-29 11:08:41

标签: java java-8 classcastexception

我写了一些代码如下:

public class MyClass {
    public static void main(String[] args) {
        printIt(getLong());
        System.out.println("---------");
    }

    public static Object printIt(Object... objects) {
        System.out.println(objects[0].toString());
        return objects[0];
    }

    public static <T> T getLong() {
        return (T)Long.valueOf(1L);
    }
}

当我运行它时,它会抛出java.lang.ClassCastException,如下所示:

  

线程“main”中的异常java.lang.ClassCastException:   java.lang.Long无法强制转换为[Ljava.lang.Object;在   com.sealinetech.MyClass.main(MyClass.java:5)

但是当我用Evaluate Expression调试它时,没关系 Evaluate Expression is OK

我的IDE是intellij,JDK版本是jdk1.8.0_144

2 个答案:

答案 0 :(得分:0)

getLong方法具有泛型返回类型。在编译时编译器决定使用Object[]结果类型调用它,因为printIt接受此参数类型。在运行时编译器建议失败,因此您收到此错误:java.lang.Long cannot be cast to [Ljava.lang.Object

您可以使用printIt(this.<Object>getLong());指定预期类型(感谢@CoderinoJavarino)

答案 1 :(得分:0)

如前所述,异常来自于编译器将Object[]解析为Object而非T的事实。

我知道这个代码只是一个更复杂的玩具示例。根据实际情况的不同,已经建议的替代解决方案是将类型参数<T extends Number>的返回约束为非数组类型的选择。在这个简单的例子中,它可能就像Long

但是,需要指出的是,仅查看问题代码,似乎很清楚,给定方法的名称,它将返回long或者null,如果T,不是一个有效的值,这里只是更有意义摆脱类型参数Long并将返回类型设置为long或{{1}}。