Java: 类型转换异常 - [Ljava.lang.Long; 无法强制转换为java.lang.Long

5

我使用red5和IConnection类来设置/获取属性,但这并不重要。

'L'在java中表示long。因此,0L是类型为Long的0,而不仅仅是类型为Integer的'0'。

以下错误消息中[Ljava.lang.Longjava.lang.Long之间有什么区别:

stack trace: java.lang.ClassCastException: [Ljava.lang.Long; cannot be cast to java.lang.Long

更新

代码示例:

 static Long getLongAttribute(IConnection conn, String attribute) {
    Long result=null;
    try {
        if (!conn.hasAttribute(attribute))
            throw new Exception(attribute +  " - Long attribute not found!");
      result = conn.getLongAttribute(attribute); // <--- ERRROR ON THIS LINE
    } catch (Exception e) {
        _handleException(e);
    }
    return result;
}

你能展示导致异常的代码吗? - Cameron Skinner
我知道Long和Long数组的所有要点,但是我想知道为什么那行代码会引发异常。我在Red 5文档中找到了这个链接http://dl.fancycode.com/red5/api/org/red5/server/api/ICastingAttributeStore.html#getLongAttribute%28java.lang.String%29,它说该方法返回Long而不是long数组,那么为什么会出现异常呢...... - Vishwanath
@Vishwanath:看起来实际问题在于conn.getLongAttribute调用的内部。在问题中提供的代码中没有强制转换,但是如果没有完整的堆栈跟踪,很难确定问题的确切位置。如果result = conn.getLongAttribute存在类型不匹配,则编译器会捕获它。 - Cameron Skinner
4个回答

23

第一个对象是 Long 数组,第二个只是 Long。尝试这样做

    Long l = 1l;
    Long[] l2 = {};
    System.out.println(l.getClass());
    System.out.println(l2.getClass());

输出

class java.lang.Long
class [Ljava.lang.Long;

但我确实同意[L_class_;这种表示数组类型的方式非常令人困惑。我想知道它是怎么变成这样的。


2
演示是数组类的二进制类名。它在JVM规范中指定,并且也在http://download.oracle.com/javase/6/docs/api/java/lang/Class.html#getName()中指定。 - Stephen C
设计师试图使用在语法上非法的内部类型名称,以防止任何人故意使用这些内部类型名称声明变量。因此,您被迫将某些东西声明为 Long[] 而不是 [Ljava.lang.long - TMN
1
@Stephen 这正是问题所在,为什么不使用更友好的符号(例如 java.lang.Long[])。这并不意味着有任何技术难度。 - Nikita Rybak
@TMN 你能澄清一下吗?使用这些内部类型名称声明变量会有什么问题? - Nikita Rybak
@TMN - 我并不认为他们在Java 1.1及以后的环境下需要这样做...。 @Nikita - 这个设计决策可能是在Java 1.0之前做出的。犯了错误,无法纠正。这可能是其中之一。 - Stephen C
好的,我找不到任何讨论非法语法声明的参考资料,所以我会撤回那个说法。但是我找到的是,奇怪的名称并不是类型,而实际上是“字段描述符”。它是对象类型的内部表示。请查看JVM规范的4.3.2节。 - TMN

2

您的代码尝试将 Long[] 强制转换为 Long,导致了 ClassCastException


1
我遇到了类似的问题,我的代码是这样的:

List<Object[]> rows = criteria.list();

但我的筛选条件只有count(*) projection,因此criteria.list()返回的只是List<Long>而不是List<Long[]>
我通过将其更改为以下内容来解决它:

List<Object> rows = criteria.list();


1

[Ljava.lang.Long 是一个 java.lang.Long 列表的数组

编辑:如下面所述,它是一个数组。不好意思,我打得太快了……


2
从技术上讲,一个长整型数组:即 Long[] - Cameron Skinner
@Cameron Skinner:嗯,我转身去做其他事情,注意到我的错误,现在已经太晚了... ;) 但是没错,你是正确的。 - sjngm
@Cameron Skinner:不要有任何不愉快的感觉 ;) - sjngm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接