我需要将该方法实现为通用方法。怎么做?
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;
}
但我收到错误消息:方法的返回类型丢失.....
答案 0 :(得分: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()
和getDescricao()
方法。如果您有使用这些方法的父类/接口,请说ParentItem
(其中Sexo extends ParentItem
或Sexo implements ParentItem
),您应该使用:
public <E extends ParentItem> SelectItem[] criarFiltrogenerico(E[] tp) {
答案 1 :(得分:0)
一般来说,有两种方法可以解决这个问题,而无需为每种类型重写代码:
您使用泛型。这意味着拥有包含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]
。
答案 2 :(得分: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
}