2017-05-04 35 views
4

:私は、コンパイルエラーを以下しまった相互参照

abstract class Element<S : Snapshot> 
abstract class Snapshot<E : Element> 

Error:(6, 28) Kotlin: One type argument expected for class Snapshot<E> defined in model Error:(6, 25) Kotlin: One type argument expected for class Element<S> defined in model

Kotlinで同じタイプのパラメータ制限を再現する方法はありますか?

答えて

10

Kotlinには生の型はありません。型パラメータを削除することはできません。生タイプに似

1つのオプションは、star projectionsを使用することです:

abstract class Element<S : Snapshot<*>> { /* ... */ } 
abstract class Snapshot<E : Element<*>> { /* ... */ } 

しかし、あなたは通常、型パラメータの一般的なメンバーと協力することはできません。


別のオプションは、このような相互の制約を導入することである。この定義では

abstract class Element<E : Element<E, S>, S : Snapshot<S, E>>() { /* ... */ } 
abstract class Snapshot<S : Snapshot<S, E>, E : Element<E, S>>() { /* ... */ } 

を、あなたはSomeSnapshot: Snapshot<SomeSnapshot, SomeElement>を定義した場合ので、タイプSomeElementは、SomeSnapshotを認識していることを確認することができますElement<SomeElement, SomeSnapshot>から派生するように制約されています。

その後の実装は次のようになります。

class SomeElement : Element<SomeElement, SomeSnapshot>() { /* ... */ } 
class SomeSnapshot : Snapshot<SomeSnapshot, SomeElement>() { /* ... */ } 
関連する問題