我有这个界面:
interface Entity<PK> {
PK getPk();
void setPk(PK pk);
}
我这样重写:
class User implements Entity<User.PK> {
PK pk;
@Override
public PK getPk() { return pk; }
@Override
public void setPk(PK pk) { this.pk = pk; }
// Composed primary key
class PK {
String id;
String email;
}
}
但是,如果我必须扩展 User 类来扩展泛型类型 User.PK
,我就不能这样做,因为 UserEntity 类型的 setPk(UserEntity.PK) 方法必须重写或实现父类(super class)型方法
。
class UserEntity extends User {
PK pk;
@Override
public PK getPk() { return pk; }
@Override
public void setPk(PK pk) { this.pk = pk; }
class PK extends User.PK implements Serializable {
String id;
String email;
}
}
那么如何为给定的泛型类型创建一个接口(interface),同时又能扩展实现它的类呢?
最佳答案
我建议这个解决方案:
- 您的
interface Entity<PK>
看起来不错 - 摘录
class PK
定义到名为UserPk
的单独文件中 - 稍微重新定义
User
像这样
class User<PK> implements Entity<PK> {
private PK pk;
@Override
public PK getPk() { return pk; }
@Override
public void setPk(PK pk) { this.pk = pk; }
}
稍后使用它,例如 new User<UserPk>()
- 也放入单独的类(class)
class UserEntityPk extends UserPk implements Serializable {
String id;
String email;
}
- 重复使用
class User<PK>
以这种方式使用新的关键参数new User<UserEntityPk>()
关键思想是将参数化类与键的定义分开,以简化架构。
顺便说一句,只是好奇你们的键定义之间有什么区别?他们俩都有相同的id
和email
字符串。所以看起来你不需要 class PK extends User.PK implements Serializable
完全没有。
关于java - 覆盖类泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58645520/