kotlin

2017-08-04 11 views
3

のインタフェースを使用しているとき、私はkotlinするJavaでいくつかのクラスを変換することだし、インターフェイスを継承しようとしたとき、私はコンパイルエラーに実行しているプラ​​ットフォームの宣言の衝突を取得:kotlin

プラットフォーム宣言衝突:以下は、宣言には同じものがあります JVM署名(getContentID()Ljava/lang/String;):

public open fun get-content-id():String? public open fun getContentId():String?ここで

インタフェースである:ここ

interface Media { 
    val contentId: String 

    val displayRunTime: String 

    val genres: List<String> 

    val programId: String 

    val runTime: String 

    val type: String 
} 

クラスです:

class Airing : Media { 
    override val contentId: String? = null 
    override val displayRunTime: String? = null 
    override val genres: List<String>? = null 
    override val programId: String? = null 
    override val runTime: String? = null 
    override val type: String? = null 

    override fun getContentId(): String? { 
    return contentId 
    } 

私はkotlinするスーパー新たなんです。

+0

インターフェイスのMediaで変数または関数を定義しましたか?彼らは変数(Kotlinのプロパティ)のように見えます。私は関数のリスト(Javaのメソッド)を定義し、それらを 'Airling'クラスで実装したいと思います。大丈夫ですか? – lalosoft

答えて

3

Mediaインターフェイスのval contentId: Stringがすでにoverride val contentId: String?によってオーバーライドされているため、override fun getContentId(): String?を宣言する必要はありません。

エラーは、宣言した関数が、contentIdプロパティ(getterは同じシグネチャを持つ)に対してすでに生成されているゲッターでJVMバイトコードで衝突することを意味します。

Kotlinでは、プロパティcontentIdを直接使用する必要がありますが、Javaでは生成されたアクセサgetContentId()setContentId(...)を使用できます。

また、Kotlinでは、ヌル入力可能なStringプロパティを無効にすることはできません。これは、ベースインターフェイスのユーザーがプロパティからヌル値ではないと予想するためです。オーバーライドされたプロパティタイプをStringに置き換えるか、またはインターフェイスでString?にする必要があります。 valとして宣言

+0

'String'プロパティを' String? 'プロパティでオーバーライドする問題もあります。 –

+0

@ JornVernee、ありがとう、答えを更新しました。 – hotkey

0

変数は、Javaのようなfinal変数であり、あなたが以下のようにする必要がありOptional ?

あなたの変数宣言のように設定することはできませんのでinmutableです:

interface Media { 
    var contentId: String? 
    //... 
} 
2

主な問題はT?Tを含むタイプでありますおよびnull。次にTT?のサブセットです。あなたは、たとえば、そのスーパーセットタイプでTプロパティをオーバーライドすることはできません。

interface Source { val content: Any } 

//        v--- ERROR: `Any?` is not a subtype of `Any` 
class Image(override val content:Any?) : Source 

をただし、例えば、そのサブセットタイプまたはサブタイプT?プロパティをオーバーライドすることができます。

interface Source { val content: Any? } 

//        v--- `Any` is a subset of `Any?` 
class Image(override val content:Any) : Source 

// `String` is a subtype of `Any` & `Any?` includes `Any` 
//        v 
class Text(override val content:String) : Source 

コードは次のようになります。しかし、Kotlinはヌル・安全システムでは、プロパティは、NULL可能財産であったとしても、それを初期化せずにプロパティを定義することはできません。

class Airing : Media { 
    //   v--- ERROR: the property isn't initialized  
    override val contentId: String 
    ... 
} 

あなたはクライアントをできるように、プライマリコンストラクタのプロパティを導入すべきです例えば、あなたはまた、プロパティのためのいくつかのデフォルト値を提供することができます

class Airing 
constructor(
     override val contentId: String, 
     override val displayRunTime: String, 
     override val genres: List<String>, 
     override val programId: String, 
     override val runTime: String, 
     override val type: String 
) : Media 

:例えば、将来的にそれらを初期化するコード

class Airing : Media { 
    override val contentId: String = "<default>" 
    override val displayRunTime: String = "<default>" 
    override val genres: List<String> = emptyList() 
    override val programId: String = "<default>" 
    override val runTime: String = "<default>" 
    override val type: String = "<default>" 
} 

およびgetContentId機能はgetterと競合しますので、削除する必要があります。

+0

* Note *:このメソッドは、不変の 'val'プロパティを適用します。これは、オーバーライドメソッドがそのJavaのサブタイプで返される型を提供できるからです。つまり、変更可能な 'var'プロパティにルールを適用することはできません。 –