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);
}
- Das ist eine Menge code, können Sie eine Minimale, Vollständige und Überprüfbare Beispiel?
- Herzlich willkommen auf Stack Overflow! Bitte die tour, um zu sehen, wie die Website funktioniert und welche Fragen sind beim Thema hier, und Bearbeiten Sie Ihre Frage entsprechend. Siehe auch: so erstellen Sie eine Minimale, Vollständige und Überprüfbare Beispiel
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre
artistSupplier
- Funktion ist definiert alsFunction<String, Artist>
mit einzelnenString
- Eingang und -Artist
Ausgang, während Sie versuchen, übergeben Sie eine Funktion, die zwei Argumente(b,c)
und zurückArtistIterator
:Da Ihr code nicht enthalten
Event#setArtistSupplier
Umsetzung kann ich nur davon ausgehen, dass es so etwas wie dieses:BEARBEITEN
Was Sie tun müssen, ist:
Function
geben.