我在投射设置<时遇到错误超类型> 到设置<子类型>
我收到以下错误:
无法从Set< AppUserRole>设置< AppUserRoleEntity>
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;
}
有人可以告诉我如何解决这个问题吗?请帮忙
答案 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。
此外,最好的解决方案是使用接口而不是实现类型。