2016-03-24 15 views
1

1.0.1より前のバージョンのKotlinからいくつかのコードを見直しても、拡張プロパティが機能しなくなったようです。実際には、それでもやりますが、もはやそれを無効にすることはできません。V1.5.1でKotlin拡張プロパティが認識されない

は、このクラスを考えてみましょう:

class TestClass { 

    override val loggerName: String 
     get() = "A new name" 

    fun aMethod() { 
     info("test info message") 
    } 
} 

事前Kotlin 1.0.1あなたは次の拡張子があれば、これは動作します:

val Any.loggerName: String 
    get() = javaClass.simpleName!! 

fun Any.info(message: String) { 
    //... 
} 

loggerNameはデフォルトで問題のインスタンスのクラス名を取るだろうし。現在、loggerNameはこの場合はTestClassに正しく割り当てられていますが、無効にすることはできません。

これは、この新しいバージョンのKotlinでは偶発的なバグか新しい制限ですか?私はKotlin - Extensionsを検索しましたが、それはうまくいくはずです。

テクニカル要因

私はKotlinのプラグインのバージョン1.0.1リリース - IJ143-32とのIntelliJ IDEA 2016.1でこれをテストしてい。

EDIT 1:それが認識されている:

TestClassを(instanceOfTestClass.loggerName例)のインスタンスにアクセスするときTestClassをもがこのプロパティを認識しません。

+0

輸入品はありますか? – razzledazzle

+0

使用しているスタジオのバージョンは? – pRaNaY

答えて

3

クラスのプロパティを持つ拡張プロパティをオーバーライドすることは、プレリリース版のKotlinでは不可能でした。また、1.0.1では可能でもありませんでした。拡張プロパティは静的メソッドにコンパイルされ、拡張プロパティにアクセスするコードは単に静的メソッドを呼び出すだけです。受信機のタイプに基づいて動的ディスパッチを実行する可能性はない。

オーバーライドを指定しないと、拡張プロパティが機能します。あなたはそれをアクセスしようとする場所にインポートしていることを確認する必要があります。

+0

申し訳ありませんが、私は何をしたとしても、それは事故であったと思います。それは1つのクラスのために働いたが、もし私がもっとクラスでそれをテストすれば、それはないだろう。代わりに拡張関数を使うことで解決できますか、それとも同じ結果になるのでしょうか? – Limnic

+0

いいえ、結果は同じになります。発送は常に静的です。 – yole

0

以下のように確認してくださいあなたのgradle見てください:

apply plugin: 'kotlin-android' 
... 
sourceSets { 
    main.java.srcDirs += 'src/main/kotlin' 
} 
... 
dependencies { 
    ... 
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" 
} 
... 
buildscript { 
    ext.kotlin_version = '1.0.0-XYZ' 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" 
    } 
} 

をごkotlinバージョンで$kotlin_versionを交換してください。

注:あなたはのAndroid Studioの2.0プレビューを使用している、プラグインでいくつかの行動を期待して、今あなたが1.5バージョンを使用することをお勧めためのようにも、いくつかの状況では、作業を停止し場合それが期待どおりに機能しているからです。

Configuring Android Studio with Kotlin

があなたの役に立てば幸い参照してください。

関連する問題