[英]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
,因为您不能假定T
是Child
。 它可能是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.