Kotlin继承

我目前正在学习把我的杂乱的代码分成DDD(注意,学习)范例。 实体( IEntityIUser )是域层由接口组成,然后在数据层( BaseEntityUser )实现。 通过存储库模式访问数据。 但是当我为IUserRepository定义返回IUser ,在数据层,我必须手动将它返回给IUser以匹配返回签名。

我怎样才能避免铸造? 谢谢。

域图层

 interface IEntity { var id: Long? var name: String? } interface IUser : IEntity { } interface IBaseRepository<T: IUser> { fun get(id: Long): Observable<T?> } interface IUserRepository : IBaseRepository<IUser> { } 

数据层

 abstract class BaseEntity() : IEntity { @SerializedName("id") override var id: Long? = null @SerializedName("full_name") override var name: String? = null } class User() : BaseEntity(), IUser { } interface UserRetrofitApi { @GET("user/{uuid}/") fun get(id: Long): Observable<User?> } class UserRepository(private val _api: UserRetrofitApi) : IUserRepository { override fun get(id: Long): Observable<IUser?> { return _api.get(id) as Observable<IUser?> // How to avoid casting here without resorting to generic UserRepository<T: IUser> } } 

在基本仓库中声明你的get函数,如下所示:

 fun get(id: Long): Observable<out T?> 

并同样将UserRepositoryget函数UserRepository为:

 override fun get(id: Long): Observable<out IUser?> { return _api.get(id) } 

有关更多信息,请参阅差异文档 。

如果我理解你是正确的,你只需要改变你将UserRetroFitApi.get的结果返回给Observable<IUser?>

 class UserRetrofitApi { fun get(id: Long): Observable<IUser?> { val user = User() user.id = 1 user.name = "User 1" return Observable.just(user) } }