【发布时间】:2017-12-28 15:45:57
【问题描述】:
我在将 Set 转换为 Set
时遇到错误我收到以下错误:
无法从 Set
转换为 Set
interface AppUserRole {
void m1();
}
class AppUserRoleEntity implements AppUserRole {
@Override
public void m1() {
}
}
interface AppUser {
void m2(Set<AppUserRole> abc);
}
class AppUserEntity implements AppUser {
Set<AppUserRoleEntity> role;
@Override
public void m2(Set<AppUserRole> abc) {
this.role = (Set<AppUserRoleEntity>) abc;// Compilation fails here
}
}
阅读 PECS 后,我修改了我的代码,如下所示
Set< ? super AppUserRoleEntity> role;
但不是在同一类的 getter 方法上我收到警告
类型安全:来自 Set 设置
@Override
public Set<AppUserRole> getAppUserRoles() {
return (Set<AppUserRole>) appUserRoles;
}
谁能告诉我如何解决这个问题?请帮忙
【问题讨论】:
-
"有人能告诉我如何解决这个问题吗?" -> 是的,部署PECS。 TL;DR:泛型不是协变的。
-
@azurefrog 相关,但反过来说:OP 询问为什么不能将动物列表转换为狗列表。当然,答案是动物列表中可能包含猫。
-
derp,咖啡前阅读理解失败:/
-
@PrzmyslawMoskal 我在上面对 azurefrog 所做的评论相同。 OP 正在询问相反的情况。
-
你为什么认为你首先需要做这个演员?为什么
role集合不能只是Set<AppUserRole>?在您的编辑中,您甚至似乎将集合返回为Set<AppUserRole>。