You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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);
    }
}

额外提两个小优化点

  1. 你的Kreis类没重写toString(),默认会打印类似Kreis@1234567的内存地址,建议重写一下让输出更有用:
@Override
public String toString() {
    return "Kreis [x=" + x + ", y=" + y + ", radius=" + radius + "]";
}
  1. 你的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:32:07