如何实现Generic方法

时间:2013-06-26 12:21:02

标签: java generics

我需要将该方法实现为通用方法。怎么做?

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

我必须实现更多这样的方法,我需要为每个不同的实体进行复制。所以我有很多方法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;
    }

但我收到错误消息:方法的返回类型丢失.....

3 个答案:

答案 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) {

答案 1 :(得分:0)

一般来说,有两种方法可以解决这个问题,而无需为每种类型重写代码:

  1. 您使用泛型。这意味着拥有包含criarFiltroSexo(...)函数的整个对象,并为要使用它的每个类创建一个对象。如果criarFiltroSexo位于名为DoStuff的类中,并且Sexo扩展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]

答案 2 :(得分: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;
}

您可能希望使用varargs参数,而无需更改方法体:

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