java - lambda 表达式中的错误返回类型无法将 Object 转换为 T

标签 java generics lambda

我有一个惰性迭代器,它几乎接收一个函数和一个字符串作为参数,转到 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/

相关文章:

c# - C# 中的显式方法表而不是 OO - 好吗?坏的?

c++ - lambda 是静态的是什么意思?

java - Java 中函数式接口(interface)的威力在哪里?

java - Dagger2 - 应用程序不能依赖于多个作用域组件

java - 如何在 Java 中等待按钮按下

c# - 如何在 C# 中为接受 IComparable 的通用方法处理 double.NaN

c# - 使用 lambda 为通用列表中的每个对象执行方法

java - 套接字编程: Inputstream Stuck in loop - read() always return 0

java - EditText 将字符串保存为整数然后将其乘以 3 不起作用?

powershell - 从 powershell 向集群添加通用服务