首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将Set<Supertype>大小写为Set<Subtype>

无法将Set<Supertype>大小写为Set<Subtype>
EN

Stack Overflow用户
提问于 2017-12-28 15:45:57
回答 2查看 79关注 0票数 0

集< Supertype >转换为Set<子类型>时出错

我收到以下错误:

不能从Set< AppUserRole >转换到Set< AppUserRoleEntity >

代码语言:javascript
复制
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之后,我修改了代码,如下所示

代码语言:javascript
复制
    Set< ? super AppUserRoleEntity> role;

但不是在同一类的方法上,我得到警告

类型安全性:未检查的强制转换从Set<捕获#2-of?超级AppUserRoleEntity >设置

代码语言:javascript
复制
@Override
    public Set<AppUserRole> getAppUserRoles() {
        return (Set<AppUserRole>) appUserRoles;
    }

有人能告诉我怎么解决这个问题吗?请帮帮忙

EN

回答 2

Stack Overflow用户

发布于 2017-12-28 16:01:24

我的建议是在接口中声明泛型类型:

代码语言:javascript
复制
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

    }

}
票数 0
EN

Stack Overflow用户

发布于 2017-12-28 15:54:38

您可以删除类型并为您的类型执行未选中的强制转换,如下所示:

代码语言:javascript
复制
@Override
public void m2(Set<AppUserRole> abc) {
    this.role = (Set<AppUserRoleEntity>) (Set<?>) abc;
}

另外,如果Set类型为接受扩展AppUser的捕获,则可以在不删除的情况下进行强制转换。

代码语言:javascript
复制
@Override
public void m2(Set<? extends AppUserRole> abc) {
    this.role = (Set<AppUserRoleEntity>) abc;
}

那只是个不安全的演员。如果您传递一个不是AppUserRoleEntity的项类型,程序将抛出ClassCastException。

此外,最好的解决方案是使用接口而不是实现类型。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48010338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档