gpt4 book ai didi

Java 传递泛型对象

转载 作者:行者123 更新时间:2023-12-02 11:54:02 25 4
gpt4 key购买 nike

我有不同的对象(对象 A 和对象 B)。但有些对象的字段是相同的。 我无法更改对象类(我的意思是我无法为它们编写实现/扩展条件)。我想将对象传递给使用对象字段的方法它们具有相同的字段。我不想重载。哪种设计最适合这个?

A obj1 = new A();
B obj2 = new B();

update(obj1);
update(obj2);

// my function
public <T extends myInterface> void update(T obj)
{
obj.field+=1;
}
<小时/>
public interface myInterface{
int field=0;
}

--------------
public class A{
int field;
.... // smt else
}
--------------
public class B{
int field;
.... // smt else
}

最佳答案

如果您有两个没有实现公共(public)接口(interface)或共享公共(public)基类的类,则无法真正将它们传递给您的函数。

他们有共同领域这一事实并不重要。

您有 3 种解决方法,但没有一种是真正好的:

  1. 让您的函数接受 Object 类型,并使用 instanceof 检查其内部类型(A 或 B)。这很丑陋,不推荐,因为任何类都可以在内部传递,而且您的代码必须始终检查它的类型。
  2. 让你的函数接受Object类型,使用反射来访问具有特定名称的字段,这样:

    Field 字段 = obj.getClass().getDeclaredField('myfeild');对象值 = field.get(obj);

这样更好,因为您的代码不必检查类型,但更不安全。任何类都可以传递给您的函数,并且有一些依赖于静态字段名称的黑魔法。如果字段名称发生更改,您的代码就会中断。

  • 也许是最好的 - 为您的对象实现一个包装器。它将有两个构造函数,一个用于 A 类,一个用于 B 类。包装器将记住其中驻留的是哪种类型的对象。在其 getField 函数中,if 将有一个 if 语句。让您的函数接受包装类型作为参数。
  • 关于Java 传递泛型对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47714017/

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