如何实现引用一致类型的Kotlin接口?

时间:2018-09-27 17:27:31

标签: generics kotlin generic-variance

出于愚蠢的思想实验的兴趣,这些愚蠢的思想实验的主要目的是探索语言的一部分是如何工作的,所以我决定想探索一种使Python程序员在Kotlin中更舒适的方法。简单地说,我可以通过添加以下内容来实现:

class Foo {
    private val self:Foo get() = this
    ...
}

(在旁边的问题:还有一种更通用的方式将Foo称为返回类型,以便如果我将Foo更改为Bar,则变量类型{{1 }}还会引用“此方法的实现类”吗?)

必须在每节课中都加上这一行,以便我们可以自私地感觉到pythonic是乏味的。所以我转向一个接口。我最初想要的是类似Swift的self类型的Protocols。但是我在科特林找不到类似的东西。阅读https://kotlinlang.org/docs/reference/generics.html(似乎与Kotlin差不多,这与Java有关)之后,我得出结论,也许“声明站点差异”对我来说很重要:

Self

这更好。我不希望在声明中两次列出类名,这是不希望的,但是我认为没有办法解决。有吗?

此外,这适用于最终课程,但如果我想在根层次上使用符合Selfish的课程层次结构,事情就会分崩离析:

interface Selfish<out T> {
    val self:T get() = this as T
}

class Foo:Selfish<Foo> {
}

使用class Foo:Selfish<Foo> { ... } class Bar:Foo { ... } 的Bar中的方法类型错误。并且添加self会产生冲突。

有没有我尚未发现的用于使类型引用继承类型的工具?

除了接口之外,还有其他方法可以做到这一点吗?

我是否使用“声明网站差异”做出了错误的选择?

2 个答案:

答案 0 :(得分:1)

我认为您应该看看extensions

所以你可以写

fun <T>Foo.getSelf(): T {
    return this as T
}

那么就拥有

open class Foo

class Bar: Foo()

如此

Bar().getSelf<Bar>()

将返回Bar类的对象

甚至更容易,您可以编写

fun <T:Foo>T.getSelf(): T {
    return this as T
}

所以您可以打电话给

Bar().getSelf()

获取从Foo扩展的任何类的实例

答案 1 :(得分:0)

根据您的建议@DEADMC,我使用了全局扩展名val,而不是fun。它没有回答在不使用泛型模式的情况下如何在实现中大体上引用一致类型的问题,而是DID以更简单和可扩展的方式解决了更大的问题:

val <Anything>Anything.self:Anything inline get() = this