2017-11-07 11 views
4

これをちょっと説明するのに役立つかもしれません。KotlinインターフェイスのCarat構文

は、私はそうのように見えるページと呼ばれる抽象クラスを持っていると言う:

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

と書籍と呼ばれるインターフェース:

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 
    } 
} 

アム私は、ジェネリックはここで働いてどのように誤解しますか?どんな助けも非常に高く評価されるでしょう。

答えて

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

ありがとう、それはまさに私がやろうとしていたものです。ちょうどドキュメントで特定できませんでした。 一般的な制約! Whodathunkit! もう一度おねがいします! –

2

あなたは、特に上限をkotlin制約を使用することができます。私は、ジェネリックはここで働いてどのように

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

ドキュメントhere

+0

あなたが休憩をリンクオフのチャンスに関連する部分を引用または要約することができます。 –

+0

@ RuckusT-Boom私はそれを行う方法を知らない、私は他のユーザーがそれをしたのを見た –

+0

あなたの答えに参照するページの関連部分をコピー/貼り付け(多分書き直すことができます)。 –

関連する問題