gpt4 book ai didi

java - 将一个对象复制到另一个更改某些字段的数据类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:13 24 4
gpt4 key购买 nike

我有两个java对象如下:

class A {
int a;
int b;
}

class B {
int a;
Double b;
}

A objA = new A();
objA.a = 5;
objA.b = 6;

我想将 objA 克隆到 objB 中,以便将字段 b 转换为从 objB 访问时加倍,即

objB.b = 6.0
objB.a = 5

注意:

  • 类必须不同。
  • 类非常庞大,单独复制和类型转换似乎不是一个很好的选择。
  • 我无法从 A 扩展类 B,因为字段名称完全相同,除了少数字段的数据类型在类 B 中从 int 更改为 Double。

最佳答案

frameworks在不同类的对象之间进行映射。查看评论。

如果您不想使用第三方库,您可以针对这些框架提供的内容编写一个过度简化的版本。

例如,如果字段名称相同,只是类型不同,我们可以写成method(A a, B b, Rules r)。这将映射 ab根据给定的规则1:

public static void copyFromAtoB(A a, B b, Map<String, Function<Object, Object>> rules) throws NoSuchFieldException, IllegalAccessException {
for (Field f : B.class.getDeclaredFields()) {
final String fName = f.getName();
final Object aValue = A.class.getDeclaredField(f.getName()).get(a);

f.set(b, rules.containsKey(fName) ? rules.get(fName).apply(aValue) : aValue);
}
}

规则2 告诉我们应该对字段应用什么函数才能正确设置值。

如果字段没有规则,我们假设类型是兼容的。

final A a = new A(5, 6);
final B b = new B();

final Map<String, Function<Object, Object>> rules = new HashMap<>();
rules.put("b", i -> Double.valueOf((int)i)); // int -> Double

copyFromAtoB(a, b, rules);

1 是的,这是一种反射方法 - 它可能成本高昂且设计过度,但它看起来非常灵活。
2 规则定义不明确,因为我们采用 Object并返回 Object ( Function<Object, Object> ).

关于java - 将一个对象复制到另一个更改某些字段的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51424551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com