gpt4 book ai didi

generics - 如何实现引用符合类型的 Kotlin 接口(interface)?

转载 作者:行者123 更新时间:2023-12-02 12:22:25 24 4
gpt4 key购买 nike

为了探索主要目的是探索语言的一部分如何工作的愚蠢思想实验,我决定探索一种让 Python 程序员在 Kotlin 中更自在的方法。简单地说,我可以通过添加来做到这一点:

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

(旁白问题:是否有更通用的方法将 Foo 称为那里的返回类型,这样如果我将 Foo 更改为 Barself 的变量类型仍将引用“实现这个方法的类”?)

必须在每个类中添加该行,这样我们才能感觉到自私的 pythonic 是乏味的。所以我转向了一个界面。我最初想要的是 Swift 的 Self 之类的东西协议(protocol)类型。但我在 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> {
}

这样更好。在声明中我必须两次列出类名是不可取的,但我认为没有办法解决这个问题。有吗?

此外,这适用于最终类,但如果我想要一个在根级别符合自私的类层次结构,事情就会分崩离析:

class Foo:Selfish<Foo> { ... }
class Bar:Foo { ... }

Bar 中使用 self 的方法是错误的类型。并添加 , Selfish<Bar>造成冲突。

有没有我还没有发现的工具可以使类型引用继承类型?

是否有另一种方法(除了接口(interface))来做这样的事情?

我使用“声明站点差异”做出了错误的选择吗?

最佳答案

我认为你应该看看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 扩展的任何类的实例

关于generics - 如何实现引用符合类型的 Kotlin 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542238/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com