谈谈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同时指定泛型参数。

上一篇下一篇

猜你喜欢

热点阅读