Java 无法设置案例集<;超类型>;设置<;亚型>;
我在将集Java 无法设置案例集<;超类型>;设置<;亚型>;,java,generics,Java,Generics,我在将集转换为集时出错 我遇到以下错误: 无法从集合强制转换为集合 接口AppUserRole{ 空m1(); } 类AppUserRoleEntity实现AppUserRole{ @凌驾 公共空间m1(){ } } 界面应用程序用户{ 空隙m2(设置为abc); } 类AppUserEntity实现AppUser{ 设定角色; @凌驾 公共空间m2(设置为abc){ this.role=(Set)abc;//此处编译失败 } } 在阅读了PECS之后,我修改了我的代码,如下所示 S
接口AppUserRole{
空m1();
}
类AppUserRoleEntity实现AppUserRole{
@凌驾
公共空间m1(){
}
}
界面应用程序用户{
空隙m2(设置为abc);
}
类AppUserEntity实现AppUser{
设定角色;
@凌驾
公共空间m2(设置为abc){
this.role=(Set)abc;//此处编译失败
}
}
在阅读了PECS之后,我修改了我的代码,如下所示
Set< ? super AppUserRoleEntity> role;
Set<?超级AppUserRoleEntity>角色;
但不是在同一类的getter方法上,我得到了警告
类型安全:未经检查的从集合@覆盖
公共集getAppUserRoles(){
返回(设置)appUserRoles;
}
有人能告诉我如何解决这个问题吗?请帮助您可以删除类型并对您的类型执行未选中的强制转换,如下所示:
@Override
public void m2(Set<AppUserRole> abc) {
this.role = (Set<AppUserRoleEntity>) (Set<?>) abc;
}
@覆盖
公共空间m2(设置为abc){
this.role=(Set)(Set)abc;
}
此外,如果Set被键入为接受extends-AppUser的捕获,则可以在不进行擦除的情况下执行强制转换
@Override
public void m2(Set<? extends AppUserRole> abc) {
this.role = (Set<AppUserRoleEntity>) abc;
}
@覆盖
public void m2(Set我的建议是在接口中声明泛型类型:
interface AppUserRole {
void m1();
}
class AppUserRoleEntity implements AppUserRole {
@Override
public void m1() {
}
}
interface AppUser<R extends AppUserRole> {
void m2(Set<R> abc);
}
class AppUserEntity implements AppUser<AppUserRoleEntity> {
Set<AppUserRoleEntity> role;
@Override
public void m2(Set<AppUserRoleEntity> abc) {
this.role = abc;// No cast needed
}
}
接口AppUserRole{
空m1();
}
类AppUserRoleEntity实现AppUserRole{
@凌驾
公共空间m1(){
}
}
界面应用程序用户{
空隙m2(设置为abc);
}
类AppUserEntity实现AppUser{
设定角色;
@凌驾
公共空间m2(设置为abc){
this.role=abc;//不需要强制转换
}
}
“有人能告诉我如何解决这个问题吗?”->是的,deploy.TL;DR:泛型不是协变的。@azurefrog是相关的,但反过来说:OP是问为什么动物列表不能投射到狗列表中。当然,答案是动物列表可能包含猫。derp,咖啡前阅读理解失败:/@PrzmyslawMoskal我在上面对azurefrog.OP I做的相同评论s问的是相反的情况。为什么你认为你首先需要执行此强制转换?为什么不能将角色
集设置为集
?在编辑中,你甚至会将该集作为集
返回。当abc
包含用户角色以外的其他实现时,这将在运行时失败
显式强制转换也会失败…这就是为什么我们
@Override
public void m2(Set<? extends AppUserRole> abc) {
this.role = (Set<AppUserRoleEntity>) abc;
}
interface AppUserRole {
void m1();
}
class AppUserRoleEntity implements AppUserRole {
@Override
public void m1() {
}
}
interface AppUser<R extends AppUserRole> {
void m2(Set<R> abc);
}
class AppUserEntity implements AppUser<AppUserRoleEntity> {
Set<AppUserRoleEntity> role;
@Override
public void m2(Set<AppUserRoleEntity> abc) {
this.role = abc;// No cast needed
}
}