Tag: inheritance

Kotlin通用属性问题

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

Kotlin覆盖子types的乐趣

我无法inheritance包含一个基types的方法/乐趣的接口,我想重写作为实现它的类中的子types。 到目前为止,我有界面 interface IModel { fun convert(dataModel: BaseDataModel) } 而实施它的class级: 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 } } 而不需要施放它。 我想我不能,因为它修改了有趣的签名,使它不是一个真正的重写。 我尝试使用generics和通用约束,但没有运气: interface IModel { […]

Kotlin覆盖Java setter

我用这个方法实现一个java接口(Command): void setInputStream(InputStream in); 我想用Kotlin制定者来覆盖这个: class ProxyCommand : Command { lateinit var _inputStream: ChannelPipedInputStream var inputStream: InputStream get() = this._inputStream set(value) { // This should override it. this._inputStream = (value as ChannelPipedInputStream) } } 但是我得到这个错误在set(value) : Accidental override: The following declarations have the same JVM signature (setInputStream(Ljava/io/InputStream;)V): public final fun (value: InputStream): Unit defined in […]

在kotlin中,如何传递一个MutableList,其中目标需要一个List

有一个定义为List值的哈希映射: private var mMap: HashMap<String, List>? = null 有一个函数返回一个哈希映射,但与MutableList的值 fun getDataStatus(response: JSONObject?): HashMap<String, MutableList> { return HashMap<String, MutableList>() } 当将结果传递给期望列表的HashMap时,会出现错误: mMap = getDataStatus(resp) //<== got error 有错误: Error:(81, 35) Type mismatch: inferred type is HashMap<String, MutableList> but HashMap<String, List>? was expected

抑制关于“没有文件com.foo.Bar $ toString()”的Dokka投诉?

我正在使用Gradle Dokka插件0.9.16-eap-1生成一些Kotlin代码的文档。 我是一个没有破窗户types的人,因此有点沮丧,插件生成吨的消息,我没有明确记录一个重写的方法,在基类中充分记录的类的消息, 例如 : package com.foo /** * A silly class to demonstrate silliness. */ class Bar : java.io.InputStream() { override fun read() = -1 override fun toString() = “BAZ!” } 对于这个class级,Dokka谴责: No documentation for com.foo.Bar$read() (Bar.kt:6) No documentation for com.foo.Bar$toString() (Bar.kt:7) 这有点乏味,因为我不想用复制粘贴文档冗余地冗余文档。 看看Dokka README.md ,我看到的唯一相关配置选项是: dokka { … // Emit warnings about not […]

对象的快速inheritance和接口的含义

我在Kotlin中find:Object文档的一个例子: open class A(x: Int) { public open val y: Int = x } interface B {…} val ab: A = object : A(1), B { override val y = 15 } 所以我用更有意义的名字实现了这个例子,我不知道在逗号分隔的超types列表之间的接口的原因是什么? interface Toy { fun play () { println(“Play, play….”) } } open class Ball(public open val color: String = “red”) {} val […]

inheritance时kotlinvariables参数错误

open class A(vararg vars: String) class B(vararg vars: String):A(vars) 错误: 必需:find的字符串:数组 如何解决这个问题呢?

Kotlin数据类inheritance+复制方法

我从个人经验和这个讨论中了解到,当一个data classinheritance自另一个inheritance了类的字段的类不包含在数据类的copy函数中。 我感兴趣的是解决这个问题的选项。 具体来说,我有一个JPA @MappedSuperClass为我的JPA实体,这是data class ES。 在超类中,我设置了实体ID,至少到目前为止,我总是希望以相同的方式进行操作。 还有一些其他的事情我也想做,比如设置一个创建日期,最后更新日期等。 我到目前为止考虑的选项: 将ID,创建日期等复制粘贴到每个实体中。 优点:这很容易和复制方法的作品。 缺点:失败DRY,你不能处理所有使用共享超类的实体。 (但可以为此创建一个接口。) 重写超类的值,并将它们传递给超类。 您仍然需要将覆盖值复制粘贴到每个实体中,但至少您不必复制注释。 @Entity data class Comment( @Lob comment: String, override val id: Long = -1 ) : BaseEntity(id) @MappedSuperclass abstract class BaseEntity( @Id @GeneratedValue(strategy = GenerationType.AUTO) open val id: Long = -1 ) ??? 我什至不能想到第三个选项是有效的。 还有另一种方法吗? 使ID为var,并且每次都创建一个自定义的复制方法? 这听起来很丑。

错误或特征:Kotlin允许在inheritance中将“val”更改为“var”

我刚开始探索Kotlin语言。 我正在努力inheritance,var和val和副作用。 如果我声明一个具有val x的特征A并且在AImpl覆盖x ,则可以将其重写为var (参见下面的代码)。 令人惊讶的是A的print()方法受x的重新分配影响,即使x是A的值。 这是一个错误还是一个function? 码: trait A { fun print() { println(“Ax = $x”) } val x : Int; } class AImpl(x : Int) : A { override var x = x; // seems like x can be overriden as `var` } fun main(args: Array) { val a = AImpl(2) a.print() […]

Kotlin属性不能被子接口覆盖

在下面的精简的例子中,你能解释为什么Kotlin编译器在覆盖一个我们进一步限制它的types的时候会抱怨(编译器消息: Var-property type is ‘B’, which is not a type of overriden public abstract var a: A ) interface A interface B : A { fun someFunc():Boolean } class C : B { override fun someFunc(): Boolean { return true } } abstract class D { abstract var a: A } class E : D() […]