java泛型声明,通过构建器方法调用时默认为类型对象

nimxete2  于 2023-04-19  发布在  Java
关注(0)|答案(2)|浏览(119)

我有一系列的数据传输对象,DTO。它们有一些元素是每个不同的DTO所共有的。一个元素是DTO的集合,因为我们可以一次处理一个列表或一系列这些DTO。我使用了泛型,所以Spring可以处理不同的DTO并传递给UI。下面是我的GenericListDTO()类的一些摘录。

@XmlElement
    @NotNull
    private Collection<DTO> dataList;
    @XmlElement
    private int totObjs;

我的DTO构建器是这样定义的:

public static <DTO> GenericListDTOBuilder<DTO> builder() { 
   return new GenericListDTOBuilder<>(); 
}

下面是在我的GenericList类中定义的构建器类。

public static class GenericListDTOBuilder<DTO> {
        private Collection<DTO> dataList;

        public GenericListDTOBuilder<DTO> data(@NotNull Collection<DTO> data) {
            this.dataList = dataList;
            return this;
        }

        private int total;
        
        public GenericListDTOBuilder<DTO> total(int total) {
            this.total = total;
            return this;
        }

        public GenericListDTO<DTO> build() {
            return new GenericListDTO<>(this.data, this.total, this.validUntil);
        }

        
        }

    }

在类的后面我有这个构造函数。

@NotNull
    public static <DTO> GenericListDTO<DTO> just(@NotNull Collection<DTO> dataList) {
        
        return  builder().dataList(dataList).total(dataList.size()).build();
    }

.dataList(dataList)部分的Intellij给出此错误,“Required type:收藏:收藏。
我不明白为什么当dataList被定义为私有集合dataList时,它会给出这个错误;我传入一个Collection对象。
为了让这个没有错误,我必须双重铸造它。
return(GenericListDTA)builder().dataList((Collection)dataList).total(dataList.size()).build();
为什么它不把dataList识别为DTO的Collection?为什么它默认为Collection

1qczuiv0

1qczuiv01#

问题似乎是在GenericListDTOBuilder.data()方法上。您正在分配参数值而不是data

public GenericListDTOBuilder<DTO> data(@NotNull Collection<DTO> data) {
   this.dataList = data;
   return this;
}
jjjwad0x

jjjwad0x2#

这可能是在just()方法中推断builder()的返回类型时出现的问题。
有两种方法可以解决这个问题。首先,将builder()的返回值提取到一个局部变量,然后调用其上的方法:

GenericListDTOBuilder<DTO> builder = builder();
    return builder.dataList(dataList).total(dataList.size()).build();

其次,在调用builder()方法时提供类型参数。要获取类型参数,还需要用类名限定静态方法:

return GenericListDTOBuilder.<DTO>builder().dataList(dataList).total(dataList.size()).build();

请注意,静态just方法中的类型变量DTO与类中的类型变量DTO不同。您最好重命名此类型变量以避免混淆。
参见this answer

相关问题