Java lambda表达式中的返回类型错误,无法将对象转换为T

Java lambda表达式中的返回类型错误,无法将对象转换为T,java,generics,lambda,Java,Generics,Lambda,我有一个惰性迭代器,它几乎接收函数和字符串作为参数,转到API,从API接收DTO,并将该DTO转换为域对象(在本例中为事件)。如下图所示,本次活动由一位艺术家和几首曲目组成。我的问题(不仅在这里)是,当我在EventIterator中尝试通过传递lambda表达式来填充artistSupplier时,我得到错误“lambda表达式ArtistDto中的错误返回类型无法转换为T” 公共类EventIterator扩展SetListIterator实现迭代器{ 私人职能; 私有字符串; 私人Las

我有一个惰性迭代器,它几乎接收函数和字符串作为参数,转到API,从API接收DTO,并将该DTO转换为域对象(在本例中为事件)。如下图所示,本次活动由一位艺术家和几首曲目组成。我的问题(不仅在这里)是,当我在EventIterator中尝试通过传递lambda表达式来填充artistSupplier时,我得到错误“lambda表达式ArtistDto中的错误返回类型无法转换为T”

公共类EventIterator扩展SetListIterator实现迭代器{
私人职能;
私有字符串;
私人LastfmApi LastfmApi;
公共事件迭代器(字符串、函数、LastfmApi LastfmApi){
this.lastfmApi=lastfmApi;
这个.s=s;
这个函数=函数;
page=1;
}
@凌驾
公共R转换器域类型(T[]ret){
EventDto[]eventDtos=(EventDto[])ret;
LinkedList=新建LinkedList();
对于(事件到e:
事件(DTOS){
事件=新事件(
e、 getArtistName(),
e、 getEventDate(),
e、 getTour(),
e、 getTracksNames(),
getTracks(e.getTracksNames(),e.getArtistName()),
e、 getSetListId()
);
event.setArtistSupplier(
(b,c)->新艺术家(
e、 getArtistName(),
(a) ->lastfmApi.getArtistInfo(e.getArtistName())
)
);
列表。添加(事件);
}
返回(R)列表;
}
公开课活动{
私人艺术家;
私人职能艺人供应商;
私人字符串艺术家姓名;
私有字符串eventDate;
私人弦乐团;
私有字符串[]tracksNames;
私家车道;
私有字符串setlistId;
公共供应商(职能供应商){
本.艺人供应商=供应商;
}
公众艺术家(s){
返回艺术家=(艺术家)艺术家供应商。应用((T)s);
}
}
公共级艺术家{
私有字符串名称;
私人字符串bio;
私有字符串url;
私有字符串[]imagesUri;
私有字符串mbid;
}
公共抽象类SetListIterator实现了迭代器{
受保护字符串s;
受保护的整型页面;
受保护的T[]DTO;
@凌驾
公共关系{
T[]ret=dtos;
如果(!hasNext())
抛出新的NoTouchElementException();
dtos=moveNext();
返回converttoomaintype(ret);
}
公共摘要T[]moveNext();
公共摘要R converttoomaintype(T[]ret);
}

您的
艺术家供应商
函数定义为
函数
,具有单个
字符串
输入和
艺术家
输出,而您正试图传递一个函数,该函数接受两个参数
(b,c)
,并返回
艺术家

event.setArtistSupplier(
        (b, c) -> new ArtistIterator<R, U, T>(
                e.getArtistName(),
                (a) -> lastfmApi.getArtistInfo(e.getArtistName())
        )
);
编辑

您需要做的是:

event.setArtistSupplier((name) -> {
    Artist artist = ...; // convert name to Artist (e. g. load artist based on name)
    return artist;

});

这是很多代码,你能提供一个吗?欢迎使用Stack Overflow!请查看该站点的工作方式和主题中的问题,并相应地编辑你的问题。另请参见:完全一样。但即使我用泛型替换字符串和艺术家,它仍然会产生相同的错误,即使你将类型更改为泛型,问题remains:您试图传递的某个函数的参数数量不正确。setter要求传递的函数只有一个输入参数,而您传递的函数有两个输入参数=这显然不是
函数
类型。问题是我希望所有函数都是惰性的,所以当我要求艺术家时,它会使用该函数n Artist Supplier并填充Artist这没问题,但您需要将lambda表达式更改为correct from(更改参数声明部分-请参见我的编辑)。
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;

});