繁体   English   中英

如何实现Generic方法

[英]How to implement a Generic method

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

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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM