Java泛型通配符-在这里如何将泛型与Lambda一起使用?
我正在尝试创建一个通用方法。我的DTO是: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
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中的抽象方法也将帮助您实现这一点