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

    }

}