bad return type in lambda-Ausdruck kann nicht konvertieren Objekt T

Habe ich so faul iterator, der ziemlich viel erhält eine Funktion und einen string als Parameter, geht um eine API, erhält ein DTO von der API und konvertiert das DTO zu einem domain-Objekt (in diesem Fall ein Event). Dieses Ereignis, wie unten zu sehen ist, die aus einer Künstlerin und mehreren Spuren. Mein problem (nicht nur hier) ist, dass, wenn in meiner EventIterator, versuche ich zum Auffüllen meiner artistSupplier, indem ein lambda-Ausdruck, erhalte ich die Fehlermeldung "Bad return type in lambda-Ausdruck ArtistDto kippe umgewandelt werden T".

public class EventIterator<T, U, R> extends SetListIterator<T, U, R> implements Iterator<R> {

private Function<U, T[]> function;
private String s;
private LastfmApi lastfmApi;

public EventIterator(String s, Function<U, T[]> function, LastfmApi lastfmApi) {
    this.lastfmApi = lastfmApi;
    this.s = s;
    this.function = function;
    page = 1;
}

@Override
public R convertToDomainType(T[] ret) {
    EventDto [] eventDtos = (EventDto[]) ret;
    LinkedList list = new LinkedList<Event>();
    for (EventDto e:
         eventDtos) {
        Event event = new Event(
                e.getArtistName(),
                e.getEventDate(),
                e.getTour(),
                e.getTracksNames(),
                getTracks(e.getTracksNames(), e.getArtistName()),
                e.getSetListId()
         );
        event.setArtistSupplier(
                (b, c) -> new ArtistIterator<R, U, T>(
                        e.getArtistName(),
                        (a) -> lastfmApi.getArtistInfo(e.getArtistName())
                )
        );
        list.add(event);
    }
    return (R) list;
}


public class Event {

private Artist artist;
private Function<String, Artist> artistSupplier;
private String artistName;
private String eventDate;
private String tour;
private String [] tracksNames;
private Iterable<Track> tracks;
private String setlistId;

public void setArtistSupplier(Function<T, U> supplier) {
    this.artistSupplier = supplier;
}

public Artist artist(String s) {
    return artist = (Artist) artistSupplier.apply((T) s);
}

}

public class Artist {

private String name;
private String bio;
private String url;
private String [] imagesUri;
private String mbid;

}

public abstract class SetListIterator<T, U, R> implements Iterator<R> {

protected String s;
protected int page;
protected T []dtos;

@Override
public R next() {
    T[] ret = dtos;
    if (!hasNext())
        throw new NoSuchElementException();
    dtos = moveNext();
    return convertToDomainType(ret);
}

public abstract T[] moveNext();

public abstract R convertToDomainType(T[] ret);
}
Schreibe einen Kommentar