谈谈java的泛型
2020-03-13 本文已影响0人
田文健
今天写代码遇到个问题,如下
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(String source) {
return StringUtils.isNotBlank(source) ? LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME) : null;
}
};
}
这个bean在Spring中可以创建的。然后IDEA“智能”的提醒我这个可以写成lambda
@Bean
public Converter<String, LocalDateTime> localDateTimeConverter() {
return source -> StringUtils.isNotBlank(source) ? LocalDateTime.parse(source, DateTimeFormatter.ISO_LOCAL_DATE_TIME) : null;
}
嗯,这样看起来简洁多了,然后运行,报错:
java.lang.IllegalArgumentException: Unable to determine source type <S> and target type <T> for your Converter
what?换种写法就错了?然后想到是泛型的问题,再读了一些泛型的资料,明白其中的原因.
具体就是lambda没有指定泛型参数类型,所以Spring框架拿到的对象的类是Converter<Onject, Object>,他就不知道要转换什么参数了。(Java虽然不能在运行时获取对象泛型类型,但可以获取类定义的泛型参数)
所以如果要lambda有泛型参数,必须见定义一个接口继承Converter同时指定泛型参数。