Java泛型通配符-在这里如何将泛型与Lambda一起使用?

Java泛型通配符-在这里如何将泛型与Lambda一起使用?,java,generics,lambda,java-8,Java,Generics,Lambda,Java 8,我正在尝试创建一个通用方法。我的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(S

我正在尝试创建一个通用方法。我的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;
    }
}
扩展Master的子类是:

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))));
    }
公共静态映射getRecreacteMasterMappedByInstrumentId和Date(列表主控){
return masters.stream().collect(Collectors.groupingBy(Child::getString,Collectors.groupingBy(x->org.apache.commons.lang3.time.DateUtils.truncate(x.getDate(),Calendar.DAY/u/u MONTH));
}

上面的代码在编译时给了我一个错误。如何为同一方法编写泛型方法?

在声明后删除绑定:

  • 返回类型:
    Map
  • 参数类型:
    列出主控程序

只能在通配符(
)或类型变量声明中使用边界。

您必须理解类型变量声明和类型变量使用之间的区别。当你写作时

public static <T extends Master> Map<String, Map<Date, List<T>>>
    getRecalculateMasterMappedByInstrumentIdAndDate(List<T> masters) {
    …
}
公共静态映射
GetRecreacteMasterMappedByInstrumentId和Date(列出主控程序){
…
}
声明类型变量
T
,包括
T
必须是
Master
的子类型的约束。返回类型
Map
和参数类型
List
中出现的其他
T
使用类型变量
T
,不需要重复(事实上不允许重复)
T
的边界


请注意,您还必须在方法实现中使用
Master::getString
,因为您不能假定
t
子项。它可能是
子类
,但调用者也可以将
主类
或其任何子类用于
T
。谢天谢地,
getString
已经在
Master
中定义好了,所以您不需要在这里假设
子对象。谢谢大家。我的解决方案:

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))));
    }
用于重新计算的公共静态映射GetMastersMappedByInstrumentId和Date(列表主控){
返回masters.stream();
}

您不能在方法内部使用
子项
,因为编译器不知道它。编译器只知道
Master
。删除绑定或仅使用
Master
方法。在这里,master中的抽象方法也将帮助您实现这一点