Il punto è che

new TypeToken<List<Author>>() {}

ovvero una estensione con anonymous inner class è il modo per avere a RUNTIME la rappresentazione completa della parametrizzazione, ovvero in quel caso List<Author>

Se fai

new TypeToken<List<T>>() {}

quella rappresentazione completa viene a mancare, ovvero Gson non può certo "capire" che vuoi una lista di Author


Le soluzioni ci sono, sicuramente anche più di una. Una che mi viene in mente:

- classe astratta

codice:
public abstract class ControllerAuthorEditor<T> {
    // .....

    protected abstract TypeToken<List<T>> getToken();    // lo usi da initialize()
}

- sottoclasse concreta es.

codice:
public class ControllerAuthor extends ControllerAuthorEditor<Author> {
    protected TypeToken<List<Author>> getToken() {
        return new TypeToken<List<Author>>() {};
    }
}

(idem per Editor)

Ovvero, detto in generale, "specializzare" solo la costruzione del TypeToken.