allora, ReadJson ha diversi metodi per la lettura di alcuni file json.
ha un metodo per ogni file json da leggere.
ad esempio, getAllAuthors:
codice:
    public ArrayList<Author> getAllAuthors() throws IOException {
        File file = new File(UrlAndPath.JSON_AUTORI);
        ArrayList<Author> list = new ArrayList<>();
        if (file.exists()) {
            Gson gson = new Gson();
            JsonParser parser = new JsonParser();
            try (BufferedReader bf = new BufferedReader(new FileReader(file))) {
                JsonArray jarray = parser.parse(new JsonReader(bf)).getAsJsonArray();
                for (JsonElement e : jarray) {
                    Author au = gson.fromJson(e, Author.class);
                    list.add(new Author(au.id, au.name));
                }
            }
        }
        return list;
    }
il file da leggere, in effetti, è impostato in maniera "fissa", prendendolo da una classe che ha solo delle costanti che uso in varie parti del programma.
come vedi vado a creare un ArrayList<Author> (una cosa simile faccio per gli Editor).

per quanto riguarda ArrayList<? extends Object>, hai ragione.
ma non mi è venuto in mente altro.
perchè al metodo riempiCombo, dovrei passare o ArrayList<Author>, o ArrayList<Editor>, a seconda della sotto-classe che richiamo.