【问题标题】:Java generics both methods have same erasure errorJava泛型两种方法都有相同的擦除错误
【发布时间】:2020-05-07 05:41:25
【问题描述】:

在我的项目中,我有多个服务执行三个基本操作 - 创建、编辑和搜索。为此,我正在尝试创建一个通用服务。以下是我到目前为止的想法。

Search 方法将在运行时获取对象列表。

public interface GenericService<T> {

   void update(T t);

   void create(T t);

   T search(List<?> t);
}

另外,我创建了一个抽象类,所有服务的公共代码都将放置在其中。

public abstract class AbstractService<T> implements GenericService<T> {


}

这是我的实现

public class AccountService extends AbstractService<Account> implements GenericService<Account> {
    @Override
    public void update(Account account) { }

    @Override
    public void create(Account account) { }

    @Override
    public Account search(List<SearchCriteria> t) { return null; }
}

这是我的 Account 和 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
    }

问题:在线公众号搜索(List t) { return null; },得到编译错误说

'搜索(列表)'在 'com.test.AccountService' 与 “com.test.GenericService”中的“搜索(列表)”; 两种方法都有相同的擦除,但都没有覆盖另一个

【问题讨论】:

  • 将界面中search中的List&lt;?&gt;改为List&lt;T&gt;
  • @Schred - 我也试过了 - 它给出了以下编译错误:'com.optidesk.core.service.test.AccountService' 中的'search(List)' 与'search (List)' in 'com.optidesk.core.service.test.GenericService';两种方法都有相同的擦除,但都没有覆盖另一个
  • 你的搜索方法真的可以列出任何东西吗,你不能在你的接口定义中使用 SearchCriteria 吗?
  • 是的,它可以列出任何东西。我真的需要了解为什么当前实现编译失败

标签: java generics


【解决方案1】:

为了

public Account search(List<SearchCriteria> t) { ...}

覆盖

T search(List<?> t);

类型参数替换后参数必须相同,但? 不是SearchCriteria

因此,如果你想保留这些方法(继承对我来说有点疯狂),你需要进一步参数化类型。

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) { /* ... */ }
}

【讨论】:

  • 霍廷你拯救了我的一天
【解决方案2】:

GenericService 中的List&lt;?&gt; 更改为List&lt;SearchCriteria&gt; 将解决该错误。如果search 方法在每个服务实现中总是采用SearchCriteria 对象列表,那么使用通配符没有任何好处。

但是,如果您也想使其通用,则可以引入第二个类型参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多