代码之家  ›  专栏  ›  技术社区  ›  Travis Griggs

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

  •  2
  • Travis Griggs  · 技术社区  · 6 年前

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

    Foo 作为返回类型,所以如果我改变 Bar self 仍将引用“此方法的实现类”?)

    在每节课上都要写上这条线,这样我们才能感觉到自私的蟒蛇是很乏味的。所以我转向一个接口。我最初想要的是类似斯威夫特的东西 Self 协议的类型。但我在科特林找不到类似的东西。读后 https://kotlinlang.org/docs/reference/generics.html

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

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

    此外,这适用于最终类,但如果我希望在根级别拥有符合self的类层次结构,则会出现问题:

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

    在Bar中使用 是错误的类型。和添加 , Selfish<Bar> 制造冲突。

    有没有其他方法(除了接口)来做这样的事情?

    我用“申报地点差异”做了错误的选择吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andrey Danilov    6 年前

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

        2
  •  0
  •   Travis Griggs    6 年前

    根据你的建议@DEADMC,我去了一个全球扩展 val 相对于 fun . 它没有回答在不使用泛型模式的情况下如何在实现中通常引用一致类型的问题,但它确实以一种更简单和可扩展的方式解决了更大的问题:

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