允许java泛型类型接受T和T的列表

时间:2017-11-06 08:32:25

标签: java generics

我有一个对文件系统执行读写操作的接口。现在的问题是我如何使这个界面同时兼顾List和T。

import java.io.IOException;
import java.util.List;

public interface Operations<T> {

    void save(T serializableObject) throws IOException;
    List<T> get() throws IOException;

}

上述代码既适用于Operations<List<User>>,也适用于Operations<User>

如果我有重载方法,我将有一个重复的代码

@Override
    public void saveCollection(List<T> serializableObjects) throws IOException {
        String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObjects);
        BufferedWriter br = new BufferedWriter(new FileWriter(file));
        br.write(jsonData);
        br.close();     
    }

    @Override
    public void save(T serializableObject) throws IOException {
        String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject);
        BufferedWriter br = new BufferedWriter(new FileWriter(file));
        br.write(jsonData);
        br.close();
    }

3 个答案:

答案 0 :(得分:3)

添加接受T

集合的方法
 void save(T serializableObject) throws IOException;
 void save(Collection<T> listOfTs);

答案 1 :(得分:1)

如果您担心代码重复,为什么不简单地将常用实现放入一个单独的私有方法中,并使用现有的重载将其参数转发给它?

private void saveImpl(Object serializableObject) throws IOException {
    String jsonData = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(serializableObject);
    BufferedWriter br = new BufferedWriter(new FileWriter(file));
    br.write(jsonData);
    br.close();
}

@Override
public void save(List<T> serializableObjects) throws IOException {
    saveImpl(serializableObjects);
}

@Override
public void save(T serializableObject) throws IOException {
    saveImpl(serializableObject);
}

答案 2 :(得分:0)

您可以使用varargs。该方法可能如下所示:

void save(T... objects) throws IOException;

然后可以用

调用
  • 一个论点:obj.save(myArgument)
  • 多个以逗号分隔的参数:obj.save(myFirstArgument, mySecondArgument)
  • 一个数组:obj.save(new MyArgumentType[]{myFirstArgument, mySecondArgument})
相关问题