美文网首页
谈谈java的泛型

谈谈java的泛型

作者: 田文健 | 来源:发表于2020-03-13 20:51 被阅读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同时指定泛型参数。

    相关文章

      网友评论

          本文标题:谈谈java的泛型

          本文链接:https://www.haomeiwen.com/subject/xnsyshtx.html