簡體   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