可能有助于解释这一点。
假设我有一个名为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
}
}
我是否误解了仿制药在这里的运作方式?非常感谢任何帮助。
答案 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
而不是Page
或T
,代表“类型”。
标识符与您自己创建的类型匹配的事实只是偶然的。
我想你要宣称的是,一本书是一个页面的集合,或比页面更专业的。这称为'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