Java技术问询:类间能否返回对象数组及子类存储Value数组到HashMap问题
搞定Value数组存HashMap的问题
嘿,先帮你捋捋你当前思路里的几个小问题哈:
- 你用的静态变量
x和ARRAY是全局共享的,多线程场景下很容易出问题,而且类加载时new Value(new Object[x])只会执行一次,之后改x的数值也不会更新这个数组的大小,完全达不到你想要的动态数组效果。 - 更关键的是,你创建的
ARRAY是单个Value对象,不是Value[]数组啊!就算Value类有接收Object[]的构造方法,这也只是把Object数组传给了Value的构造器,它本质还是一个Value实例,和你要存的Value[]类型完全不搭,自然解决不了问题。
其实你的核心需求很简单:在继承自Value的MyVisitor类里,把Value[]数组存到HashMap里,或者返回Value[]类型。根本不需要搞那些静态变量,直接用泛型或者明确的类型声明就能解决,给你两个具体方案:
方案1:直接用泛型HashMap存Value[]
直接声明HashMap的value类型为Value[]就行,这和MyVisitor继承Value一点冲突都没有。看代码示例:
public class MyVisitor extends Value { public void handleArray() { // 声明HashMap,键用String举例,你可以换成自己需要的类型 HashMap<String, Value[]> valueMap = new HashMap<>(); // 创建一个指定大小的Value数组 Value[] myValueArray = new Value[5]; // 给数组元素赋值,既可以用父类Value实例,也可以用子类MyVisitor实例 for (int i = 0; i < myValueArray.length; i++) { myValueArray[i] = new MyVisitor(); // 或者 new Value() } // 把数组存进HashMap valueMap.put("user_data", myValueArray); // 从HashMap里取出来,直接就是Value[]类型 Value[] retrievedArray = valueMap.get("user_data"); } }
这里要注意,Value[]是一个独立的数组类型,和MyVisitor本身的继承关系没关系,所以你完全可以直接用它作为HashMap的value类型。
方案2:在MyVisitor方法里返回Value[]
如果是要在MyVisitor的方法里返回Value[],直接把方法的返回类型设为Value[]就可以,完全合法:
public class MyVisitor extends Value { public Value[] createValueArray(int size) { Value[] resultArray = new Value[size]; // 初始化数组元素 for (int i = 0; i < size; i++) { resultArray[i] = new MyVisitor(); } return resultArray; } }
子类方法返回父类类型的数组是完全符合Java语法的,根本不需要额外操作。
再唠唠你的原思路为啥走不通
你写的public static Value ARRAY = new Value(new Object[x]);,本质是创建了一个Value对象,而不是Value数组。就算你把Object数组传给了Value的构造器,这个ARRAY还是单个Value实例,不是数组类型,自然没法当成Value[]存到HashMap里。而且静态变量x默认值是0,类加载时会创建一个大小为0的Object数组,之后你改x也不会重新创建数组,因为静态变量的初始化只会执行一次。
总的来说,你完全不需要绕这个弯路,直接用上面的方案就能轻松解决问题啦!
内容的提问来源于stack exchange,提问作者blah
相关产品推荐
相关产品推荐

