Java 如何实现泛型方法

Java 如何实现泛型方法,java,generics,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());

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

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;  
}
public SelectItem[]criarFiltroSexo(Sexo[]tp){
SelectItem[]选项=新建SelectItem[tp.length];
对于(inti=0;i
我必须实现更多这样的方法,并且我需要为每个不同的实体进行复制

我想实现如下内容:

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-criarFiltrogenerico(E[]tp){
SelectItem[]选项=新建SelectItem[tp.length];
对于(inti=0;i

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

一般来说,有两种方法可以解决此问题,而不必重写每种类型的代码:

  • 你使用泛型。这意味着拥有包含
    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;  
        }
        //...
    }
    
    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;  
    }
    
    公共类DoStuff{
    //...
    公共选择项[]criarFiltroSexo(T[]tp){
    SelectItem[]选项=新建SelectItem[tp.length];
    对于(inti=0;i
  • 改用继承。那么您的函数将如下所示:

    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;  
        }
        //...
    }
    
    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;  
    }
    
    public SelectItem[]criarFiltroSexo(父类[]tp){
    SelectItem[]选项=新建SelectItem[tp.length];
    对于(inti=0;i
    现在,您可以通过扩展父类的所有数组调用它,例如
    Sexo[]sexos=newsexo[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;
    }
    
    public SelectItem[]criarFiltrogenerico(T[]tp){
    SelectItem[]选项=新建SelectItem[tp.length];
    对于(inti=0;i
    您可能希望改用varargs参数,而不更改方法体:

    public <T extends HasId> SelectItem[] criarFiltrogenerico(T... tp){
        // same body
    }
    
    public SelectItem[]criarFiltrogenerico(T…tp){
    //同体
    }
    
    但我收到了错误消息:缺少方法的返回类型

    行中:

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

    这有用吗?你能详细说明一下吗?你的代码现在是完全安全的。你想在哪里应用泛型?@Marko Topolnik我必须实现更多类似的方法,并且我需要为每个不同的实体进行复制。因此我有很多方法criarfiltroxxi如果你的参数都有相同的方法(getId()和getdescripcao()),你不需要使用泛型。您可以创建一个接口来代替Sexo。我得到了一个错误:方法getDescriptaO()对于类型E是未定义的。方法getId对于类型E是未定义的。是的,我刚刚添加了这个观察。检查最后一部分:“警告是类型
    E
    ..”。这个方法是在我的名为Pessoa的bean中实现的。我无法扩展ParentItem,因为我需要调用此方法作为参数传递另一个实体,如Sexo等。
    Sexo
    是否扩展任何类或实现任何接口?Sexo不扩展任何类,也不实现任何接口。Sexo是一个枚举。