如何实现泛型方法



我需要将该方法实现为泛型。怎么做?

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

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

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

行中:

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. 您使用泛型。这意味着拥有包含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]

创建一个包含需要使用的方法的接口:

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
}

最新更新