gpt4 book ai didi

java - 使用 Class.cast 时无法将 java.lang.Float 强制转换为 float?

转载 作者:行者123 更新时间:2023-11-30 04:59:09 26 4
gpt4 key购买 nike

我已经有一个解决方案,但我不喜欢它。另外,很高兴知道您对此的想法。

你看,elem.get 返回一个Object,在 x 和 y 的情况下,它将是一个 Float

此代码抛出标题中描述的异常:

String names[] = { "x", "y", "src" };
Class types[] = { float.class, float.class, String.class };

for (int i = 0; i < names.length; i++)
{
if (elem.containsKey(names[i]))
{
par.add(types[i]);
arg.add(types[i].cast(elem.get(names[i])));
}
}

该代码用于定义实例化对象的参数列表。参数和对象的类名都在外部数据文件中定义(但没关系)。

这个解决方案是我不喜欢的(因为它失去了我试图获得的灵 active ),在 for 中包含以下内容:

if(types[i] == float.class)
{
float v = (Float)elem.get(names[i]);
arg.add(v);
} else
{
arg.add(types[i].cast(elem.get(names[i])));
break;
}

其他选项是将 types 中的 float.class 更改为 Float.class,但我不会这样做,因为该代码是用于实例化在其构造函数中具有 float 参数的对象。

谢谢!

最佳答案

作为 args 的类型是 ArrayList<Object> ,无论如何你都无法避免拳击:

// This code...
float v = (Float)elem.get(names[i]);
arg.add(v);

// Will actually be equivalent to:
float v = (Float)elem.get(names[i]);
Float boxed = v;
arg.add(boxed);

如果重点是通过反射调用构造函数,那么您将必须传入 Float对于任何 float参数 - 这就是它的工作原理。

所以基本上,改变 float.classFloat.class一切都应该正常。编辑:啊,除了 par列表将具有错误的类型。基本上你想转换 Float.class ,但是添加float.class到参数类型列表。

您可能需要一个从原始类型到包装类型的映射,如下所示:

private static final Map<Class<?>>, Class<?>> PRIMITIVE_TYPE_MAP =
buildPrimitiveTypeMap();

private static Map<Class<?>>, Class<?>> buildPrimitiveTypeMap()
{
Map<Class<?>>, Class<?>> map = new HashMap<Class<?>>, Class<?>>();
map.put(float.class, Float.class);
map.put(double.class, Double.class);
// etc
return map;
}

然后:

String names[] = { "x", "y", "src" };
Class types[] = { float.class, float.class, String.class };

for (int i = 0; i < names.length; i++)
{
if (elem.containsKey(names[i]))
{
par.add(types[i]);

// For primitive types, only box to the wrapper type
Class<?> castType = PRIMITIVE_TYPE_MAP.get(types[i]);
if (castType == null)
{
castType = types[i];
}
arg.add(castType.cast(elem.get(names[i])));
}
}
<小时/>

事实上,如果您相信这些值已经是正确的类型,我怀疑您可以这样做:

arg.add(elem.get(names[i]));

毕竟,您只是转换为特定类型,然后再次丢失该类型信息......使用 cast不过,调用确实会检查执行时类型是否正确,因此您可能希望保留它。

关于java - 使用 Class.cast 时无法将 java.lang.Float 强制转换为 float?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7521713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com