Kotlin接口中的克拉语法
可能有助于解释这一点。
假设我有一个名为Page的抽象类,如下所示:
abstract class Page { abstract fun title() : String }
而一个名为Book的界面:
interface Book { fun write(page: Page) fun read(title: String) Page }
我的问题是,如何使用克拉通用语法来指定该方法必须由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 } }
我误解了仿制药是如何在这里工作的? 任何帮助将非常感激。
我误解了仿制药是如何在这里工作的?
对,一点。
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>>
。 通常,使用标识符T
而不是Foo
或Page
,代表“类型”。
标识符与您自己创建的类型相匹配的事实只是附带的。
我想你想要声明的是一本书是一个页面的集合,或者比一个页面更专业的东西 。 这被称为“通用约束” ,你可以这样表达:
interface Book<T : Page> { fun write(page: T) fun read(title: String) : T }
您可以使用kotlin约束,特别是上限:
interface Book<T : Page> { fun write(page: T) fun read(title: String) : T }
文档在这里