1

1.0.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-release-IJ143-32 を使用して IntelliJ IDEA 2016.1 でこれをテストしています。

編集1:

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

4

2 に答える 2

3

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

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

于 2016-03-24T04:02:24.660 に答える
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_versionkotlin のバージョンに置き換えます。

注: Android Studio 2.0 Previewを使用している場合は、プラグインで動作が不安定になることが予想されます。状況によっては動作しなくなることもあります現時点では、期待どおりに動作しているため、バージョン1.5を使用することをお勧めします。

Kotlin を使用した Android Studio の構成を参照してください。

お役に立てば幸いです。

于 2016-03-24T04:20:39.023 に答える