如何获取Hashtable中自定义对象的参数?Java属性访问报错
解决Hashtable中无法访问Kreis对象属性的问题
嘿,这个问题我太熟了!你之所以拿不到x、y属性,核心原因是你用了非泛型的Hashtable,导致取出的对象被当成了最顶层的Object类型——而Object类根本没有x、y这些自定义属性,编译器自然会报错。
下面给你两种解决方案,推荐第一种,更符合现代Java的编码规范:
方案1:用泛型指定Hashtable的类型(强烈推荐)
从Java 5开始引入的泛型就是用来解决这种类型模糊问题的。你可以直接声明Hashtable的键是Integer、值是Kreis,这样get()方法会直接返回Kreis实例,不用额外转换,代码还更安全:
import java.util.Hashtable; public class HashDatastructure { public static void main(String[] args) { // 明确指定键值类型,避免类型模糊 Hashtable<Integer, Kreis> kreise = new Hashtable<>(); for(int i = 0; i < 6; i++){ kreise.put(i, new Kreis(120, 120, 60)); // 这里Java会自动把int装箱成Integer,不用手动new Integer(i) } Kreis targetKreis = kreise.get(3); System.out.println(targetKreis.toString() + " is 4. Object and this Object's X Value: " + targetKreis.x + " || Y Value: " + targetKreis.y); } }
方案2:手动强制类型转换(兼容旧版Java)
如果因为某些原因必须用非泛型的Hashtable,那你得把get()返回的Object强制转换成Kreis类型,之后才能访问它的属性:
import java.util.Hashtable; public class HashDatastructure { public static void main(String[] args) { Hashtable kreise = new Hashtable(); for(int i = 0; i < 6; i++){ kreise.put(new Integer(i), new Kreis(120, 120, 60)); } // 把Object强制转成Kreis,才能访问x、y Kreis targetKreis = (Kreis) kreise.get(3); System.out.println(targetKreis.toString() + " is 4. Object and this Object's X Value: " + targetKreis.x + " || Y Value: " + targetKreis.y); } }
额外提两个小优化点
- 你的
Kreis类没重写toString(),默认会打印类似Kreis@1234567的内存地址,建议重写一下让输出更有用:
@Override public String toString() { return "Kreis [x=" + x + ", y=" + y + ", radius=" + radius + "]"; }
- 你的
kreisCounter静态变量初始化有点问题——静态初始化时调用kreisZaehler()会让counter先加1,之后每个构造函数又调用一次,导致计数器多算了一次静态初始化的调用。可以改成这样更清晰:
public static int counter = 0; public static int kreisCounter = 0; public Kreis(int x, int y, int radius) { this.x = x; this.y = y; this.radius = radius; kreisCounter = ++counter; // 每次创建对象时直接递增计数器 }
内容的提问来源于stack exchange,提问作者Hürkan Doğan
相关产品推荐
相关产品推荐

