将集< Supertype >转换为Set<子类型>时出错
我收到以下错误:
不能从Set< AppUserRole >转换到Set< 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;但不是在同一类的方法上,我得到警告
类型安全性:未检查的强制转换从Set<捕获#2-of?超级AppUserRoleEntity >设置
@Override
public Set<AppUserRole> getAppUserRoles() {
return (Set<AppUserRole>) appUserRoles;
}有人能告诉我怎么解决这个问题吗?请帮帮忙
发布于 2017-12-28 16:01:24
我的建议是在接口中声明泛型类型:
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
}
}发布于 2017-12-28 15:54:38
您可以删除类型并为您的类型执行未选中的强制转换,如下所示:
@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。
此外,最好的解决方案是使用接口而不是实现类型。
https://stackoverflow.com/questions/48010338
复制相似问题