字节数组位于HashMap的子类实例中,我将其命名为obj
,当我在其上调用这些方法时:
Class c = obj.get("data").getClass();
System.out.println(c.getName() + " is array " + c.isArray());
打印
[B is array true
从我所读到的关于[B
符号的内容来看,这意味着它是一个字节数组。但是,当我尝试在其上调用这些方法时
System.out.println(obj.get("data").length);
或
System.out.println(obj.get("data")[0]);
或
System.out.println(obj.get("data").get(0));
或
byte[] ar = (byte[]) obj.get("data");
编译器抱怨,因为它说obj.get("data")
,它反映的是一个数组,实际上只是一个Object,因此没有这些可用的行为。
我的基本问题是:
反射方法isArray()
究竟是什么意思,如果不是它是一个数组?
答案 0 :(得分:1)
考虑
Class c = obj.get("data").getClass();
这将返回从地图中检索到的任何对象的运行时类。但是:
System.out.println(obj.get("data").length);
编译器根据映射的编译时间(声明)类验证表达式。您尚未向我们展示地图的声明,因此我们无法确定get()
返回的编译时类型。
从错误消息中我假设它
Map<String,Object> obj;
甚至只是声明没有类型参数的原始地图。
由于编译器不知道运行时类型,因此会抱怨。
解决方案是将地图声明为,例如
Map<String, byte[]> obj = new HashMap<>();