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是一个枚举。