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)