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

如何将类声明字段名与对应值转换为Map<String, Double>?

问题分析与解决

你的代码主要有两个问题导致无法正确获取字段值:

  1. 类型强制转换错误:示例中的vmax是long类型,Field.get()会返回Long对象,直接强转Double会抛出ClassCastException。
  2. 未处理非Double类型的数字字段:如果字段是其他数字类型(int、long、float等),直接强转都会出问题。

修改后的代码

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

public class Converter {
    public Map<String, Double> convert(Object object) {
        Map<String, Double> parameters = new HashMap<>();
        for (Field declaredField : object.getClass().getDeclaredFields()) {
            declaredField.setAccessible(true);
            try {
                Object value = declaredField.get(object);
                // 统一处理所有数字类型,转为Double
                if (value instanceof Number) {
                    parameters.put(declaredField.getName(), ((Number) value).doubleValue());
                }
                // 若需过滤非数字字段,可在此处添加跳过或异常抛出逻辑
            } catch (IllegalAccessException e) {
                throw new RuntimeException("无法访问字段: " + declaredField.getName(), e);
            }
        }
        return parameters;
    }
}

关键说明

  • 用Number统一兼容数字类型:Java所有数字类型(基本类型及对应包装类)都实现了Number接口,调用doubleValue()能安全将任意数字类型转为Double,不管是long、int还是float都能处理。
  • 异常处理:Field.get()会抛出IllegalAccessException,这里包装为RuntimeException抛出,你也可以根据业务需求改为自定义捕获逻辑。
  • 可选字段过滤:如果只想处理指定类型的字段,比如仅处理double/long,可以额外判断字段类型:
    Class<?> fieldType = declaredField.getType();
    if (fieldType == double.class || fieldType == Double.class || 
        fieldType == long.class || fieldType == Long.class) {
        // 执行转换逻辑
    }
    

测试示例

public class Test {
    public static void main(String[] args) {
        Car car = new Car();
        car.price = 100000.0;
        car.vmax = 200;
        
        Converter converter = new Converter();
        Map<String, Double> result = converter.convert(car);
        System.out.println(result); // 输出 {price=100000.0, vmax=200.0}
    }
}

class Car {
    private double price;
    private long vmax;
    // 无需额外getter/setter,convert方法已通过setAccessible(true)绕过访问限制
}

内容的提问来源于stack exchange,提问作者Lulex97

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:20:38