Java传递通用对象

时间:2017-12-08 12:02:13

标签: java object generics methods

我有不同的对象(对象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
}

2 个答案:

答案 0 :(得分:1)

如果你有两个类没有实现一个公共接口或共享一个公共基类,你就不能真正将它们传递给你的函数。

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

你有3个解决方法,其中没有一个是非常好的:

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

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

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

    1. 也许是最好的 - 为你的对象实现一个包装器。它将有两个构造函数,一个用于A类,一个用于B类。包装器将记住哪种对象位于其中。在getField函数中,如果只有一个if语句。让你的函数接受包装类型作为参数。

答案 1 :(得分:0)

instanceof可用于识别对象类。像这样:

public <T extends myInterface> void update(Object obj)
    {
        if ( obj instanceof A )
        {
            A a = (A)obj;
            a.field+=1;
        }
        if( obj instanceof B )
        {
            B b = (B)obj;
            b.field+=1;
        }
    }