Java泛型这两种方法具有相同的擦除错误
在我的项目中,我有多个服务执行三个基本操作:创建、编辑和搜索。为此,我尝试创建一个通用服务。下面是我到目前为止的想法 搜索方法将在运行时获取对象列表Java泛型这两种方法具有相同的擦除错误,java,generics,Java,Generics,在我的项目中,我有多个服务执行三个基本操作:创建、编辑和搜索。为此,我尝试创建一个通用服务。下面是我到目前为止的想法 搜索方法将在运行时获取对象列表 public interface GenericService<T> { void update(T t); void create(T t); T search(List<?> t); } 搜索条件类 public class SearchCriteria { private S
public interface GenericService<T> {
void update(T t);
void create(T t);
T search(List<?> t);
}
搜索条件类
public class SearchCriteria {
private String key;
private String value;
// getter setter removed for brevity
}
问题:联机公共帐户搜索(列表t){return null;},获取编译错误
中的“搜索(列表)”
“com.test.AccountService”与
“com.test.GenericService”中的“搜索(列表)”;
两种方法具有相同的擦除,但都不重写另一种方法
将GenericService
中的List
更改为List
,将解决此错误。如果search
方法在每个服务实现中总是包含SearchCriteria
对象列表,那么使用通配符没有任何好处
但是,如果您也希望将此设置为泛型,则可以引入第二个类型参数。以便
public Account search(List<SearchCriteria> t) { ...}
将界面中的
search
中的List
更改为List
@Schred-我也尝试过-它会产生以下编译错误:“com.optdesk.core.service.test.AccountService”中的“search(List)”与“com.optdesk.core.service.test.GenericService”中的“search(List)”冲突;这两种方法具有相同的擦除,但都不覆盖另一种方法。您的搜索方法真的可以获取任何内容的列表吗?您不能在接口定义中使用SearchCriteria吗?是的,它可以获取任何内容的列表。我真的需要理解为什么在当前的实现中编译失败,因为你救了我一天
public class Account {
private String accountNumber;
private Date openingDate;
// more fields
// getter setter removed for brevity
}
public class SearchCriteria {
private String key;
private String value;
// getter setter removed for brevity
}
public Account search(List<SearchCriteria> t) { ...}
T search(List<?> t);
public interface GenericService<T, C> {
// ...
T search(List<C> t); // probably change that parameter name
}
public abstract class AbstractService<T, C>
implements GenericService<T, C>
{
}
public class AccountService
extends AbstractService<Account, SearchCriteria>
implements GenericService<Account, SearchCriteria> // unnecessary
{
// ...
@Override
public Account search(List<SearchCriteria> t) { /* ... */ }
}