Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
未能强制java泛型上的类型_Java_Generics_Casting - Fatal编程技术网

未能强制java泛型上的类型

未能强制java泛型上的类型,java,generics,casting,Java,Generics,Casting,我有一个完整的树桩,摆给你们大家看看你们是否知道发生了什么 这是数据结构 Map<String, Object> objectMap 就在它失败之前: java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer 这里我最担心的是类类型似乎很长,尽管试图强制类使用Integer 我是否遗漏了什么,或者违反了Java泛型的一些概念 感谢您的帮助这是由Java类型擦除引起的。Java类

我有一个完整的树桩,摆给你们大家看看你们是否知道发生了什么

这是数据结构

Map<String, Object> objectMap
就在它失败之前:

java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.Integer
这里我最担心的是类类型似乎很长,尽管试图强制类使用Integer

我是否遗漏了什么,或者违反了Java泛型的一些概念


感谢您的帮助

这是由Java类型擦除引起的。Java类型只在源代码中使用。编译器将转换代码,就像您将强制转换所有对象一样。如果你得到一个长值,这意味着你把它作为一个长值

此代码不执行任何操作:

if (value instanceof Number)
{
    value = (Number) value;
}
背景映射中键“foo”的值显然是Long类型。不能将Long转换为整数(即使两者都是Number类型-并且都是Object;)


如果要强制使用整数,则必须在将“foo”的值放入映射时执行此操作

getObject方法返回的值是
java.lang.Long
——日志告诉您

泛型不是魔法,它们不会在类型之间转换,它们只是编译器转换回类型转换的语法糖。所以你的方法是:

public <T> T get(String variable, T defaultValue)
使用以下命令调用get方法时:

this.<Integer>get("foo", 0)
因此,ClassCastException是因为返回的
对象是
长的
,而不是
整数


如果不确切知道您想要实现什么,就很难给出具体的建议,但通常您的
Map
应该使用您希望处理的泛型类型。在您的情况下,这听起来像是
Integer
Number
。如果您确实需要任何
数字的int值(我对此表示怀疑,因为当它大于int时,该值将被截断),那么您应该使用
Number.intValue()
方法。

对于初学者,您确实不应该使用
映射。映射应该有一个单一的、特定的值类型,将它们混合在一起真的很难闻。请发送更多堆栈跟踪,在哪里发生此异常?映射的put看起来是什么样子?显然
getObject
返回的值很长。您没有给出此函数的说明。调用
map
put
方法的位置?这就是我要找的答案。我是这么想的。强制函数中的类型变为整数,而不是强制转换。在执行调用时,this.get(“foo”,0)将被转换为(integer)this.get(“foo”,0)。但是,即使是动态地,这种强制转换也比泛型执行的要少:在方法实现中可能会有进一步的强制转换。
if (value instanceof Number)
{
    value = (Number) value;
}
public <T> T get(String variable, T defaultValue)
public Object get(String variable, Object defaultValue)
this.<Integer>get("foo", 0)
(Integer)this.get("foo", 0)