为了进行愚蠢的思想实验,其主要目的是探索语言的一部分是如何工作的,我决定探索一种让 Python 程序员更适应 Kotlin 的方法。简单地说,我可以通过添加:
class Foo {
private val self:Foo get() = this
...
}
(除了问题:是否有更通用的方式来指代Foo
那里的返回类型,以便如果我更改Foo
为Bar
,变量类型self
仍将引用“此方法的实现类”?)
不得不在每个类中都写上这条线,这样我们才能感到自私地 Python 化,不过这很乏味。所以我转向了一个接口。我最初想要的是类似于 Swift 的Self
协议类型。但我在 Kotlin 中找不到类似的东西。在阅读了https://kotlinlang.org/docs/reference/generics.html(这似乎与 Java 和 Kotlin 一样多)之后,我得出结论,也许“声明站点差异”对我来说很重要:
interface Selfish<out T> {
val self:T get() = this as T
}
class Foo:Selfish<Foo> {
}
这个更好。我必须在声明中两次列出类名是不可取的,但我认为没有办法解决这个问题。在那儿?
此外,这适用于最终类,但如果我想在根级别有一个符合 Selfish 的类层次结构,事情就会分崩离析:
class Foo:Selfish<Foo> { ... }
class Bar:Foo { ... }
Bar 中使用self
的方法类型错误。添加, Selfish<Bar>
会产生冲突。
是否有我尚未发现的工具可以使类型引用继承的类型?
是否有另一种方法(除了接口)来做这样的事情?
我是否使用“声明站点差异”做出了错误的选择?