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

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

但是我收到错误消息:缺少方法的返回类型.....

4

3 回答 3

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()andgetDescricao()方法。如果您有这些方法的父类/接口,例如ParentItem(whereSexo extends ParentItemSexo implements ParentItem),您应该使用:

public <E extends ParentItem> SelectItem[] criarFiltrogenerico(E[] tp) {
于 2013-06-26T12:52:32.133 回答
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].

于 2013-06-26T12:48:18.313 回答
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
}
于 2013-06-26T12:49:53.687 回答