ok, adesso ho capito bene cosa indetevi per metodo generico!
ero partito in quarta con i generics senza ragionarci meglio sopra!

codice:
@FXML
private void esporta(ActionEvent ev) {
    Object obj = ev.getSource();
    List<Nota> list = null;
    try {
        list = db.getAll();
    } catch (SQLException ex) {
        GenericDialog.showDialog("Errore database: " + ex.getMessage(), Alert.AlertType.WARNING);
    }

    if (list != null) {
        if (obj == miJson) {
            eseguiEsporta(list, tblCaption, "Esporta JSON", new FileChooser.ExtensionFilter("JSON (*.json)", "*.json"), this::esportaNoteInJson);
        } else if (obj == miXls) {
        } else if (obj == miCsv) {
        } else if (obj == miXml) {
        }
    }
}

public void eseguiEsporta(List<Nota> list, String[] header, String titolo, FileChooser.ExtensionFilter filter, DoExport doExport) {
    Optional<File> f = dc.saveFile(getStage().getOwner(), titolo, filter);
    if (f.isPresent()) {
        try {
            doExport.export(f.get(), list, header);
            GenericDialog.showDialog("Database esportato!", Alert.AlertType.INFORMATION);
        } catch (Exception ex) {
            GenericDialog.showDialog(ex.getMessage(), Alert.AlertType.WARNING);
        }
    }
}

private void esportaNoteInJson(File file, List<Nota> list, String[] header) throws Exception {
    JsonDb ex = new JsonDb();
    ex.create(file.getAbsolutePath(), list);
}

private void esportaNoteInXml(File file, List<Nota> list, String[] header) throws Exception {
    XmlDb ex = new XmlDb();
    ex.create(file.getAbsolutePath(), list);
}

private void esportaNoteInCsv(File file, List<Nota> list, String[] header) throws Exception {
    CsvDb ex = new CsvDb();
    ex.create(file.getAbsolutePath(), header, list);
}

private void esportaNoteInXls(File file, List<Nota> list, String[] header) throws Exception {
    ExcelDb ex = new ExcelDb();
    ex.create(file.getAbsolutePath(), header, list);
}

per quanto riguarda le f.i., devo ancora capire bene, perchè il tuo esempio è molto diverso da quelli che ho visto in giro.
cmq mi pare di capire che creando i metodi con la stessa "forma" del metodo della f.i., posso usare questo "modo":
codice:
this::metodo

infatti, anche dove non necessario, hai aggiunto il parametro String[] header (ad esempio nella esportazione in json).
tanto più che, se lo levo, mi da errore.
più o meno corretto??