【问题标题】:Java foreach loop unnecessary float to int castingJava foreach 循环不必要的浮点数到整数转换
【发布时间】:2014-07-22 14:31:51
【问题描述】:
Vector<Vector<Integer>> wavesInformation;

for(Vector<Integer> waveInformation : wavesInformation) {

    for(Integer enemyIndex : waveInformation) { 

    }

}

给出运行时错误:

Exception in thread "LWJGL Application" java.lang.ClassCastException: java.lang.Float cannot be cast to java.lang.Integer

for(Integer enemyIndex : waveInformation) { 行。

这很令人困惑,因为没有使用浮点数。

写作

for(Float enemyIndex : waveInformation) {   

给出编译错误:

Type mismatch: cannot convert from element type Integer to Float

编辑:

我在调试模式下查找wavesInformation,发现存储的数字确实是浮点数(0.0)

EDIT2:

嗯,这真的很奇怪。

出于实验目的,我将 for 循环更改为:

for(int i = 0 ; i < waveInformation.size() ; i++) {

我尝试将 waveInformation 中的值赋值给如下变量:

float x = waveInformation.get(i);

和:

int x = waveInformation.get(i);

我遇到了同样的错误。

解决方案:

问题出在 Json 解析器 (libgdx) 上。我读过 libgdx json 对嵌套泛型的支持有限,它只支持第一级。例如,ArrayList&lt;Integer&gt; 可以工作,并且值被读取为整数(但必须出现json.setElementType(Mission.class, "wavesInformation", Integer.class); 行(LIBGDX JSON 特定)。ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 暂时不起作用。

解决方案是在 json 文件中该类型的任意数量之前添加java.lang.Integer,。 也可以替代 - Gson(Google Json 解析器)支持嵌套泛型。其他方案比较复杂,需要编写自定义序列化方法(read more)。

因为我现在想使用 libgdx json 解析器,所以我已更改为 `List>' 并将每个值转换为 Integer(临时解决方案)。

【问题讨论】:

  • 为什么使用 Vector?你很可能想使用 java.util.List
  • 看看这个stackoverflow.com/questions/1386275/… 因为@AdriaanKoster 是对的。向量已弃用
  • 很高兴知道,谢谢。我已经按照你的建议做了,但是使用 java.util.List 并没有解决我的问题。
  • 这就是我发表评论而不是答案的原因。

标签: java json vector foreach libgdx


【解决方案1】:

1 很可能忽略或抑制了一些关于不安全转换的编译器警告,并且您的 Vector&lt;Integer&gt; 确实包含一些 Float 对象。如果忽略这些警告,则不能保证使用泛型的代码是静态类型安全的。


1 - 在这种情况下,您正在使用的库执行此操作...

【讨论】:

  • 你能解释一下“你的 Vector 真的包含一些 Float 对象”吗?为了我的学习目标,我问了谢谢。
  • 好吧,我对Vector&lt;Vector&lt;Integer&gt;&gt; wavesInformation; 所做的一切都是从具有 Json 格式的文件中导入它。我认为这与错误无关,因为它写得很清楚,我使用的是整数。此外,没有任何警告与我的问题有关。
  • 您使用哪个框架/工具来反序列化/解组 JSON(即将其从 JSON 转换为 Java 表示形式)?在运行时,由于类型擦除,所有泛型类型信息( 等)都将被丢弃,因此您用于解组 JSON 的工具可能错误地将类型猜测为 Float,而不是 Integer。跨度>
  • 我正在使用来自 libgdx 库的 Json 类。是的,你是对的 - 解析器是问题所在。感谢您的帮助。现在我需要找到如何指定我使用的是整数。一旦找到解决方案,我将在此处发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
相关资源
最近更新 更多