我需要将该方法实现为泛型。怎么做?
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
}