Tag: 继承

通过子类来改变Kotlin中类型参数的变化

这个问题来源于我之前关于Kotlin泛型的问题 。 请在这里查看更多关于这个问题背后动机的信息。 我有一个类不受约束的类型参数 trait Handler<T> { fun handle(result: T) } 我需要创建一个Handler实例,其中T是List<O> ,因此是不可变的。 我的想法是子类Handler和注释它作为一个消费者(即通过使用) – trait ListHandler<in T>: Handler<List<T>> { } 然而,这给了我一个错误,说: “参数T被声明为'在',但发生在'不变'的位置Handler<List<T> ” 错误是什么意思,有什么办法可以解决它?

Kotlin覆盖子类型的乐趣

我无法继承包含一个基类型的方法/乐趣的接口,我想重写作为实现它的类中的子类型。 到目前为止,我有界面 interface IModel { fun convert(dataModel: BaseDataModel) } 而实施它的班级: class SettingsModel: IModel { override fun convert(dataModel: BaseDataModel) { // Conversion of models here } } 而且我也有SettingsDataModel这是: class SettingsDataModel: BaseDataModel() { } 我想要实现的是每个类/模型实现IModel,能够得到具体的DataModel,如: class SettingsModel: IModel { override fun convert(dataModel: SettingsDataModel) { // Conversion of models here } } 而不需要施放它。 我想我不能,因为它修改了有趣的签名,使其不是一个真正的重写。 我尝试使用泛型和通用约束,但没有运气: interface IModel { […]

Kotlin继承与泛型

我有一个抽象类,我们称之为A. abstract class A(private val name: String) { fun read(key: String): Entity { … } fun write(entity: Entity) { … } abstract val mapper: Mapper<Any> … interface Mapper<T> { fun toEntity(entry: T): Entity fun fromEntity(entity: Entity): T } … 它有一个抽象的映射器。 重点是我可以将不同的对象映射到实体并使用write 。 我的孩子班级,我们称之为B,是这样构造的: class B(private val name: String) : A(name) { override val mapper = […]

如何使用Gson反序列化继承的Kotlin数据类

在Android应用程序中,我需要为具有单一抽象级别的Kotlin数据类反序列化Json数据。 但我没有任何想法,在构造函数中放置正确的属性。 作为一个简单的版本,让我们说我有一个形状: abstract class Shape(open val x: Int, open val y: Int) 有两个派生 data class Circle(val radius: Int, override val x: Int, override val y: Int): Shape(x, y) 和 data class Square(val width: Int, override val x: Int, override val y: Int): Shape(x, y) 所以我的目标是,不要实例化一个形状。 所以,总是反序列化它的派生。 后来我需要处理其他类中的一些集合属性,如: val shapes: List<Shape> 但我也必须知道每个元素的派生类型。 当我试图用Gson反序列化给定的例子 val square […]

Kotlin继承

我目前正在学习把我的杂乱的代码分成DDD(注意,学习)范例。 实体( IEntity , IUser )是域层由接口组成,然后在数据层( BaseEntity , User )实现。 通过存储库模式访问数据。 但是当我为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") […]

Kotlin泛型继承 – 类型不匹配

我正在尝试为领域对象构建一组提供程序。 这是我试图构建的一个示例结构: 接口: interface IDataProvider<out T : RealmObject> { fun getRealmObject(): T } 具有类型化提供者实例化的伴随功能的基本提供者类: open abstract class BaseProvider<out T : RealmObject> constructor(protected val context: Context?) : IDataProvider<T> { companion object { fun <T : RealmObject, E : BaseProvider<T>> create(context: Context?): E { if (something) { return SomeChildProviderProvider(context) } else { throw TypeNotSupportedException() } } } […]

Kotlin覆盖成员设置并获取

有没有人知道更好的方式来听取自己的基类内的成员变化? class FOO { val t: String } class BOO: FOO { fun x(val t: String) { // notify when t was changed } } 在我看来,与观察员JavaRx会很多。 科特林代表不能继承工作(或者我找不到方法)。 我想出的最好的是在“BOO”中覆盖“t”的setter和getter。 但是这个有点尴尬,因为这个“为什么我应该覆盖一个成员?” 或者“为什么我只需要定义一个集合,然后得到什么时候我只需要设置?” 所以我的解决方案: import kotlin.properties.Delegates fun main(args: Array<String>) { var foo = FOO() foo.t = "foo" foo.printT() var boo = BOO() boo.t = "boo" boo.printT() } open […]

为什么Kotlin修饰符“打开”与“数据”不兼容?

我有一堂课 open data class Person(var name: String) 和另一类 data class Student(var reg: String) : Person("") 这给了我一个错误 错误:修饰符“打开”与“数据”不兼容 如果我从Person类删除数据的罚款。 为什么kotlin打开和数据不兼容?

Kotlin通用属性问题

在将我的Android项目从Java转换为Kotlin时,我遇到了Kotlin的一些问题。 假设我有接口I和扩展接口I的接口O. interface I{ } interface O: I{ } 通用类A具有扩展接口I的通用参数V,扩展类A的通用类B: abstract class A<V: I> { } class B : A<O>() { } 当我试图创建这样的属性: val returnB: A<I> get() = b 我得到编译器错误“需要A,找到B”。 在Java中,这将工作没有任何问题。 我怎样才能使用Kotlin访问? 我需要在我的应用程序中使用这种方法的基本类。 具有Navigator类的泛型参数的BaseViewModel: abstract class BaseViewModel<N>(application: Application, val repositoryProvider: RepositoryProvider) : AndroidViewModel(application) { var navigator: N? = null fun onDestroyView() { navigator = null […]

遗产在Kotlin

试图找出Kotlin最后的日子,阅读了文档,并找到一个例子。 在文章的底部: interface A { fun foo() { print("A") } fun bar() } interface B { fun foo() { print("B") } fun bar() { print("bar") } } class C : A { override fun bar() { print("bar") } } class D : A, B { override fun foo() { super<A>.foo() super<B>.foo() } } 现在,如果我们从A中派生出一个具体的类C,我们显然必须重写bar()并提供一个实现。 如果我们从A和B派生出D, […]