繁体   English   中英

Java传递通用对象

[英]Java passing generic objects

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

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

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

您有3个变通办法,但都不是很有效:

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

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

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

  1. 也许是最好的-为对象实现包装。 它有两个构造函数,一个用于类A,一个用于类B。包装器将记住驻留在里面的对象的类型。 在其getField函数中,if将具有单个if语句。 让您的函数接受包装器类型作为参数。

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;
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM