我写了一些代码如下:
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
答案 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}}。