无法将类型为object的值转换为long类型。

16

我有一个名为table的哈希表,值类型为long。我正在使用.values()获取值。现在我想访问这些值。

Collection val = table.values();

Iterator itr = val.iterator();
long a  =   (long)itr.next();

但是当我尝试获取它时,它会给我一个错误,因为我无法将类型为object的值转换为long。我该如何解决这个问题?


Hashtable 中的类型不能是 long,你一定是指的 Long。 - President James K. Polk
7个回答

35

试试这个:

  Long a = (Long)itr.next();

你最终将得到一个Long对象,但使用自动装箱(autoboxing),你几乎可以像使用原始的long类型一样使用它。

另一种选择是使用泛型:

  Iterator<Long> itr = val.iterator();
  Long a = itr.next();

7

Number类可用于克服数字数据类型转换问题。

在这种情况下,可以使用以下代码:

long a = ((Number)itr.next()).longValue();

我为您准备了下面的例子:

对象转换为长整型示例-1
// preparing the example variables
Long l = new Long("1416313200307");
Object o = l;

// Long casting from an object by using `Number` class
System.out.print(((Number) o).longValue() );

控制台输出将会是:

1416313200307



Object 转换为 double 的示例 - 2

// preparing the example variables
double d = 0.11;
Object o = d;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).doubleValue() + "\n");

控制台输出将会是:

0.11



Object 转换为 double 的例子 - 3

要小心这个简单的错误!如果使用doubleValue()函数来转换浮点值,那么第一个值可能不等于最终值。
如下所示,0.11 != 0.10999999940395355

// preparing the example variables
float f = 0.11f;
Object o = f;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).doubleValue() + "\n");

控制台输出将会是:

0.10999999940395355



Object 转为 float 示例 - 4

// preparing the example variables
double f = 0.11;
Object o = f;

// Double casting from an Object -that's a float number- by using `Number` class
System.out.print(((Number) o).floatValue() + "\n");

控制台的输出将会是:

0.11

4
尝试一下:long a = ((Long) itr.next()).longValue();

这比必要的更冗长 - 请参阅另一个答案,其中提到了自动装箱。 - crazyscot
@crazyscot:从 OP 的代码中我推断他使用的是 Java 5 以前的版本。 - missingfaktor

3

你应该使用Java 5的泛型特性。

当你从集合中取出一个元素时,你必须将其强制转换为存储在集合中的元素类型。 除了不方便之外,这也是不安全的。编译器不会检查你的强制转换是否与集合的类型相同,因此强制转换可能在运行时失败。

泛型提供了一种让你向编译器传达集合类型的方法,以便进行检查。一旦编译器知道集合的元素类型,它就可以检查你是否一致地使用了集合,并且可以在从集合中取出值时插入正确的强制转换。

你可以阅读这个快速教程或者这个更详细的教程


1
在我的情况下,我有一个对象数组,从flex客户端获取,有时候数字可以被Java解释为int,有时候可以解释为long,因此为了解决这个问题,我使用以下的“toString()”函数:
public Object run(Object... args) {

  final long uid = Long.valueOf(args[0].toString());

0
long value = Long.parseLong((String)request.getAttribute(""));

0

我遇到了同样的问题,但是在进行JSP编码时。上述关于Long和泛型的建议要么没有起作用,要么无法适应代码片段。

我不得不这样解决它(在JSP中):

<%Object y=itr.next(); %>

然后在脚本中像使用其他Java变量一样使用我的对象y,例如<%=y%>。


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