2013-06-26 66 views
0

我需要將方法實現爲通用方法。怎麼做 ?如何實現通用方法

public SelectItem[] criarFiltroSexo(Sexo[] tp){ 
SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
} 

我要實現更多的方法,這樣,我需要複製爲每個不同的entity.So我有很多的方法criarFiltroxxx

我想實現這樣的事情:

public <E> criarFiltrogenerico(E[] tp){ 
     SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
    } 

但我得到錯誤信息:方法的返回類型缺少.....

+6

這是否幫助? http://docs.oracle.com/javase/tutorial/extra/generics/methods.html –

+0

可以請您詳細說明嗎? – sanbhat

+0

你的代碼現在是完美的類型安全。你想在哪裏應用泛型? –

回答

2

但我得到錯誤信息:方法的返回類型缺少.....

在行:

public <E> criarFiltrogenerico(E[] tp) { 

你有什麼是public關鍵字,<E>類型的變量和方法criarFiltrogenerico(E[] tp)名稱和參數。

當然,你缺少返回類型。添加:

public <E> RETURN-TYPE-HERE criarFiltrogenerico(E[] tp) { 

所以這會工作:

public <E> SelectItem[] criarFiltrogenerico(E[] tp) { 
     SelectItem[] options = new SelectItem[tp.length]; 
     for(int i = 0; i < tp.length; i++) { 
      options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
     } 
     return options; 
} 

需要注意的是,該類型E必須有getId()getDescricao()方法。如果你有這些方法父類/接口,說ParentItem(其中Sexo extends ParentItemSexo implements ParentItem),你應該使用:

public <E extends ParentItem> SelectItem[] criarFiltrogenerico(E[] tp) { 
+0

我得到了錯誤:方法getDescricao()是未定義的類型E.方法getId是未定義的類型E. – Al2x

+0

是的,我剛剛添加了觀察。檢查最後一部分:*「警告是'E'類型*。* *。 – acdcjunior

+0

這個方法在我的名爲Pessoa的bean中實現。我不能擴展ParentItem這是因爲我需要調用這個方法作爲參數傳遞另一個實體,如Sexo等...... – Al2x

0

一般來說,您可以通過兩種方法解決此問題,而無需重寫每種類型的代碼:

  1. 您使用泛型。這意味着要讓整個對象包含您的criarFiltroSexo(...)函數併爲每個要使用它的類創建一個對象。如果criarFiltroSexo是在一個名爲DoStuffSexo類擴展ParentClass(與所有要使用該功能與其他類)例如,你會實現這樣的:

    public class DoStuff<T extends ParentClass> { 
        //... 
        public SelectItem[] criarFiltroSexo(T[] tp){ 
         SelectItem[] options = new SelectItem[tp.length]; 
         for(int i = 0; i < tp.length; i++) { 
          options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
         } 
         return options; 
        } 
        //... 
    } 
    
  2. 使用繼承來代替。然後,你的功能應該是這樣的:

    public SelectItem[] criarFiltroSexo(ParentClass[] tp){ 
        SelectItem[] options = new SelectItem[tp.length]; 
        for(int i = 0; i < tp.length; i++) { 
         options[i] = new SelectItem(tp[i].getId(),tp[i].getDescricao()); 
        } 
        return options; 
    } 
    

    現在你可以調用與擴展ParentClass的一切,例如數組Sexo[] sexos = new Sexo[10]

+0

謝謝@blalassadri – Al2x

0

創建一個具有您需要使用方法的接口:

interface HasIdAndDescricao { 
    int getId(); 
    String getDescricao(); 
} 

該接口添加到您想使用的方法類:

class Sexo implements HasIdAndDescricao { 
    // no change required 
} 

約束通用到接口:

public <T extends HasId> SelectItem[] criarFiltrogenerico(T[] tp){ 
    SelectItem[] options = new SelectItem[tp.length]; 
    for(int i = 0; i < tp.length; i++) { 
     options[i] = new SelectItem(tp[i].getId(), tp[i].getDescricao()); 
    } 
    return options; 
} 

您可能需要使用一個可變參數參數代替,而不改變方法中:

public <T extends HasId> SelectItem[] criarFiltrogenerico(T... tp){ 
    // same body 
}