【问题标题】:android - creating generic interface for two List wrappersandroid - 为两个 List 包装器创建通用接口
【发布时间】:2017-01-20 21:00:42
【问题描述】:

我必须对两种类型的列表执行类似的方法。

private List<WifiConfiguration> wifiConfigurations;
private List<ScanResult> mScanResults;

我需要扫描两个列表并寻找一些特定的项目,所以我想我会创建一个接口来包装它们,然后实现每个 doesListContains 方法。

public interface IWifiListWrapper {
    boolean doesListContains(IWifiInfo wifiInfo);
    //  <T> void setList(List<T> wifiList);
}

例如,一种实现是:

public class ScanResultsListWrapper implements IWifiListWrapper {

    private List<ScanResult> mScanResults;

    @Override
    public boolean doesListContains(IWifiInfo wifiInfo) {
       ...
    } 
}

这一切都很好。

现在,我还需要一个setList 方法来将每个实现中的列表设置为其特定的列表类型(WifiConfigurationScanResult)。

看起来应该用 Generics 以某种方式实现,但我不确定我该怎么做.. 我确实需要以某种方式在开头声明每个列表的类型,正确?所以我可以传递一个匹配的List 类型。

我应该怎么做?

【问题讨论】:

  • 为什么不使用方法类型参数呢?
  • 为什么不这样呢? public static &lt;T&gt; boolean doesListContain(List&lt;T&gt; list, T value){...}?
  • 但是这些类型是否扩展或实现IWifiInfo
  • 不,类型不扩展 IWifiInfo。 IWifiInfo 仅包含一些信息,我将与列表的项目信息进行比较。你们中的任何人都可以给我一个代码示例吗?应该是接口还是泛型类?

标签: java list generics types interface


【解决方案1】:
public interface IWifiListWrapper<T> {
    boolean doesListContains(IWifiInfo wifiInfo);
    void setList(List<T> wifiList);
}

您还可以添加限制以键入T extends WifiInfo

public class ScanResultsListWrapper implements IWifiListWrapper<ScanResult>      {
    private List<ScanResult> mScanResults;

    @Override
    public boolean doesListContains(IWifiInfo wifiInfo) {    
        ...
    } 
    @Override
    public void setList(List<ScanResult> wifiList) {
        ...
    }
}

【讨论】:

  • 非常感谢!这正是我想要的。什么时候在语法中我可以添加 T 的限制?
  • 在接口声明中public interface IWifiListWrapper&lt;T extends WifiInfo&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2020-05-12
  • 1970-01-01
相关资源
最近更新 更多