[英]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 ParentItem
或Sexo implements ParentItem
),您应该使用:
public <E extends ParentItem> SelectItem[] criarFiltrogenerico(E[] tp) {
一般来说,有两种方法可以解决这个问题,而无需为每种类型重写代码:
你使用泛型。 这意味着让整个对象包含你的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; }
现在你可以使用扩展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.