【问题标题】:Refactor method to use generics重构方法以使用泛型
【发布时间】:2018-10-01 02:10:05
【问题描述】:

一开始我写的是:

private ArrayList<Integer> getDataList() {
    ArrayList<Integer> dataList = new ArrayList<>(LEN);
    for (int i = 0; i < LEN; i++)
        dataList.add(i);
    Collections.shuffle(dataList);
    return dataList;
}

后来我决定使用泛型:

private <E> ArrayList<E> getDataList() {
    ArrayList<E> dataList = new ArrayList<>(LEN);
    for (int i = 0; i < LEN; i++)
        dataList.add(/* a procedure that generates E instance from index i*/);
    Collections.shuffle(dataList);
    return dataList;
}

接口中的静态方法是不可覆盖的,所以不能调用E上的静态方法来生成实例。

如何重构它以使用泛型?谢谢。

【问题讨论】:

  • 您可以将函数或供应商作为参数传递到您的方法中以提供元素。

标签: java generics


【解决方案1】:

您需要提供一些作为方法参数进行创建的东西:

private <E> ArrayList<E> getDataList(IntFunction<? extends E> fn) {

然后:

dataList.add(fn.apply(i));

然后像这样调用:

List<Integer> integerList = getDataList(Integer::valueOf); // Same output as non-generic code.
List<String> stringList = getDataList(i -> "Item " + i);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多