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而不是FooPage ,代表“类型”。

标识符与您自己创建的类型相匹配的事实只是附带的。

我想你想要声明的是一本书是一个页面的集合,或者比一个页面更专业的东西 。 这被称为“通用约束” ,你可以这样表达:

 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 } 

文档在这里