繁体   English   中英

Java泛型WildCard-如何在此处将Lambda与泛型一起使用?

[英]Java Generics WildCard - How can I use generic with Lambda here?

我正在尝试创建一个通用方法。 我的DTO是:

public class Master {
    private String string;
    private Date date;

    public String getString() {
        return this.string;
    }

    public Date getDate() {
        return this.date;
    }

    public void setString(String string) {
        this.string = string;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

扩展硕士课程的我的孩子班级是:

public class Child extends Master {

    private Date newDate;

    public Date getNewDate() {
        return this.newDate;
    }

    public void setNewDate(Date newDate) {
        this.newDate = newDate;
    }
}

现在,我要做的是创建一个通用方法来获得-

public static <T extends Master> Map<String, Map<Date, List<T extends Master>>> getRecalculateMasterMappedByInstrumentIdAndDate(List<T extends Master> masters) {
        return masters.stream().collect(Collectors.groupingBy(Child::getString, Collectors.groupingBy(x -> org.apache.commons.lang3.time.DateUtils.truncate(x.getDate(), Calendar.DAY_OF_MONTH))));
    }

上面的代码在编译时给了我一个错误。 我该如何为它编写通用方法?

删除声明后的边界:

  • 返回类型: Map<String, Map<Date, List<T>>>
  • 参数类型: List<T> masters

您只能将边界与通配符( ? )或类型变量的声明中使用。

您必须了解类型变量的声明与类型变量的使用之间的区别。 当你写

public static <T extends Master> Map<String, Map<Date, List<T>>>
    getRecalculateMasterMappedByInstrumentIdAndDate(List<T> masters) {
    …
}

<T extends Master>声明类型变量T其中包括以下约束: T必须是Master的子类型。 在返回类型Map<String, Map<Date, List<T>>>和参数类型List<T>中的T的其他出现正在使用类型变量T并且不需要重复(实际上不是允许重复)的边界T

注意,您还必须在方法实现中使用Master::getString ,因为您不能假定TChild 它可能是Child ,但是调用者也可以将Master或其任何子类用于T 幸运的是,无论如何, getString已经在Master定义了,因此您无需在此处假设Child

我能够在这里的人们的帮助下解决。 感谢大伙们。 我的解决方案:

public static <T extends Master> Map<String, Map<Date, List<T>>> getMastersMappedByInstrumentIdAndDateForRecalculation(List<T> masters) {
        return masters.stream().collect(Collectors.groupingBy(Master::getString, Collectors.groupingBy(x -> org.apache.commons.lang3.time.DateUtils.truncate(x.getDate(), Calendar.DAY_OF_MONTH))));
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM