我有一个惰性迭代器,它几乎接收一个函数和一个字符串作为参数,转到 API,从 API 接收 DTO 并将该 DTO 转换为域对象(在本例中为事件)。如下所示,该事件由一位艺术家和几首轨道组成。我的问题(不仅在这里)是,当在我的 EventIterator 中,我尝试通过传递 lambda 表达式来填充 artistSupplier 时,我收到错误“lambda 表达式 ArtistDto 中的错误返回类型无法转换为 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);
}
最佳答案
您的artistSupplier
函数定义为 Function<String, Artist>
与单String
输入和 Artist
输出,当您尝试传递一些接受两个参数的函数 (b,c)
时并返回ArtistIterator
:
event.setArtistSupplier(
(b, c) -> new ArtistIterator<R, U, T>(
e.getArtistName(),
(a) -> lastfmApi.getArtistInfo(e.getArtistName())
)
);
因为您的代码确实包含 Event#setArtistSupplier
实现我可以假设,它是这样的:
setArtistSupplier(Function<String,Artist> function) {artistSupplier = function;}
编辑
您需要做的是:
event.setArtistSupplier((name) -> {
Artist artist = ...; // convert name to Artist (e. g. load artist based on name)
return artist;
});
关于java - lambda 表达式中的错误返回类型无法将 Object 转换为 T,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43571766/