无法将<subpertype>设置为<subtype>

时间:2017-12-28 15:45:58

标签: java generics

我在投射设置&lt;时遇到错误超类型&gt; 设置&lt;子类型&gt;

我收到以下错误:

  

无法从Set&lt; AppUserRole&gt;设置&lt; AppUserRoleEntity&gt;

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&lt;未选中的强制转换捕获#2?超   AppUserRoleEntity&gt;设置

@Override
    public Set<AppUserRole> getAppUserRoles() {
        return (Set<AppUserRole>) appUserRoles;
    }

有人可以告诉我如何解决这个问题吗?请帮忙

2 个答案:

答案 0 :(得分:0)

我的建议是在界面中声明泛型类型:

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

    }

}

答案 1 :(得分:-1)

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

@Override
public void m2(Set<AppUserRole> abc) {
    this.role = (Set<AppUserRoleEntity>) (Set<?>) abc;
}

如果将Set键入为接受扩展AppUser的捕获,则可以在不擦除的情况下进行转换。

@Override
public void m2(Set<? extends AppUserRole> abc) {
    this.role = (Set<AppUserRoleEntity>) abc;
}

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

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