Java 如何创建填充并返回现有集合或新集合的泛型方法?

Java 如何创建填充并返回现有集合或新集合的泛型方法?,java,generics,Java,Generics,我目前正在开发一个存储库,它允许用户将对象持久化到外部存储。我想添加对列表和集合的支持,因此我添加了如下函数: public <E extends Persistable> List<E> readList(String fileName, List<E> defaultValue) public <E extends Persistable> Set<E> readSet(String fileName, Set<E> d

我目前正在开发一个存储库,它允许用户将对象持久化到外部存储。我想添加对列表和集合的支持,因此我添加了如下函数:

public <E extends Persistable> List<E> readList(String fileName, List<E> defaultValue)
public <E extends Persistable> Set<E> readSet(String fileName, Set<E> defaultValue)
public <C extends Collection<E>, E extends Persistable> C readCollection(String fileName, C defaultValue)

我的问题如下:如果用户调用
readCollection(FILE,collection)
并将非null的
collection
作为第二个参数传递,我可以使用它将存储的项添加到该
集合中。但是,如果用户以前存储过项,并将
null
作为第二个参数传递,那么我必须创建
集合的新实例。在Java中也可以这样做吗?

您可以传递一个
供应商,而不是传递一个默认的
集合
实例:

或:

如果仍然需要将元素添加到现有
集合
实例的功能,可以创建两种方法-
readCollection
readNewCollection

或者,您可以保留单个
C readCollection(String fileName,C defaultValue)
方法,并在将
null
作为第二个参数传递时决定创建哪个实例。例如,您可以确定默认类型为
ArrayList

顺便说一句,即使保留原来的两个方法--
readList
readSet
,您也会遇到同样的问题,因为
readSet
可以返回任何
Set
实现,因此如果第二个参数是
null
,它将必须决定使用哪个
Set
实现

public <C extends Collection<E>, E extends Persistable> C readCollection(String fileName, Supplier<C> supplier)
{
    C collection = supplier.get();
    ...
    return collection;
}
readCollection(name, ArrayList::new)
readCollection(name, HashSet::new)