2017-12-13 14 views
1

インタフェースに具体的な実装のオブジェクトを返す関数を追加します。具体的な実装を返すインタフェースの汎用関数

インターフェイスを持つので:MusicクラスのcloneMe()は返す必要がありますMusicオブジェクトとVideoクラスの機能cloneMe()を返す必要があります

interface Content { 
     fun <???> cloneMe(): ? 
} 

とクラス

class Music: Content 
class Video: Content 

機能Videoオブジェクトです。

私が来ている最も近いです:

interface Content { 
    fun <T: Content> cloneMe(): T 
} 

class Music : Content { 
    override fun <T : Content> cloneMe(): T { 
     return Music() as T 
    } 
} 

が、私はここでの問題は、私は「私を可能にする」未チェックのキャストを、しなければならないということです

val music: Music = Music().cloneMe<Music>() 

を行うことができます(つまり、コンパイルする)

問題があります。

これを達成する最もよい方法は何ですか?

答えて

3

次のように一般的に、これは、同様Contentインタフェースをパラメータ化することによって行われます。

interface Content<T : Content<T>> { 
    fun cloneMe(): T 
} 

と実装:あなたが達成しようとしている何

class Music : Content<Music> { 
    override fun cloneMe(): Music { 
     return Music() 
    } 
} 
+0

非常に感謝します! – FWeigl

1

はいずれにも関連する必要はありませんジェネリックス。代わりに、型を直接使用して、より詳細なオーバーライドを実装することができます。

interface Content { 
    fun cloneMe(): Content 
} 

class Music : Content { 
    override fun cloneMe() = Music() 
} 
関連する問題