Kotlin接口中的克拉语法

时间:2017-11-07 17:46:56

标签: generics kotlin

可能有助于解释这一点。

假设我有一个名为Page的抽象类,如下所示:

abstract class Page {
    abstract fun title() : String
}

一个名为Book的界面:

interface Book {
    fun write(page: Page)
    fun read(title: String) Page
}

我的问题是如何使用carat泛型语法来指定方法必须由Page类的派生实例使用。也许是这样的:

interface Book<Page> {
    fun write(page: Page)
    fun read(title: String) : Page
}

class AdventureBookPage(val pageTitle: String, val content: String) : Page() {

    override fun title() : String {
        return title
    }
}

class AdventureBook : Book<AdventureBookPage> {
    override fun write(abp: AdventureBookPage) {
        // do writing ops
    }
    override fun read(title: String) : AdventureBookPage {
        // do read ops
    }
}

我是否误解了仿制药在这里的运作方式?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:4)

  

我是否误解了仿制药在这里的运作方式?

是的,有点。

interface Book<Page> {
    fun write(page: Page)
    fun read(title: String) : Page
}

你在这里基本上宣称的是:

interface Book<Foo> {
    fun write(page: Foo)
    fun read(title: String) : Foo
}

Page只是一个标识符,代表任何旧类型。您可以制作Book<String>Book<HttpClient>Book<ArrayList<String>>。通常,使用标识符Foo而不是PageT,代表“类型”。

标识符与您自己创建的类型匹配的事实只是偶然的。

我想你要宣称的是,一本书是一个页面的集合,或比页面更专业的。这称为'generic constraint',您可以这样表达:

interface Book<T : Page> {
    fun write(page: T)
    fun read(title: String) : T
}

答案 1 :(得分:2)

您可以使用kotlin约束,特别是上限:

interface Book<T : Page> {
    fun write(page: T)
    fun read(title: String) : T
}

docs here