Kotlinではネストされた共分散はどのように機能しますか?

Animesh sahu

これは、最初のコンパイルと2番目のコンパイルがなぜコンパイルされないのか理解するのに苦労しているコードです。

class Test11<T : Number> {
    lateinit var test: MutableList<out T>.() -> Unit
}

fun main() {
    val test: Test11<Int> = Test11<Int>()
    val test2: Test11<out Number> = test
    test.test.invoke(MutableList(3) { 55 })  // First
    test2.test.invoke(MutableList(3) { 55 })  // Second
}

2番目の発言MutableList<Nothing>は予想されていた。

だから、基本的には最初のケースでは、T => Intそのうちout T => out Int => out Number多分。2番目のケースT => out Numberでは、Numberのサブクラスであるものは何でも、それでもout T => out Number正しいですか?

なぜそのロジックで動作しないのか理解できません...

Tenfour04

MutableListは関数パラメーターです。あなたはまったく同じ問題を抱えているでしょう:

class Test11<T : Number> {
    fun test(list: MutableList<out T>) {

    }
}

fun main() {
    val test: Test11<Number> = Test11<Number>()
    val test2: Test11<out Number> = test
    test.test(MutableList(3) { 55 })  // First
    test2.test(MutableList(3) { 55 })  // Second
}

定義上、共分散型は、型がパラメーターである関数が呼び出されないようにしますが、これは論理的には同じ型のネストされた共分散にも拡張されます。Tが(クラスに対して)共変である場合、Tを直接消費するよりも、Tを生成できるオブジェクトを消費する方が安全ではありません。

これがどのように失敗を引き起こす可能性があるかの例:

class Test11<T : Number> {
    var list: MutableList<out T>? = null
    fun test(list: MutableList<out T>) {
        this.list = list
    }
}

fun main() {
    val test: Test11<Long> = Test11()
    val test2: Test11<out Number> = test
    val doubleList: MutableList<out Number> = mutableListOf(1.0)
    test2.test(doubleList) // Not allowed
    
    // if it were allowed:
    val long: Long? = test.list?.firstOrNull() // ClassCastException casting the Double to a Long
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ネストされたリスト内包表記はPythonでどのように機能しますか?

分類Dev

ネストされたラムダはラケットでどのように機能しますか?

分類Dev

ネストされたif / then / elseifはbashでどのように機能しますか?

分類Dev

ネストされたループはjadeでどのように機能しますか?

分類Dev

ネストされたforループはC#でどのように機能しますか

分類Dev

Swiftでオプションの共分散はどのように機能しますか

分類Dev

ネストされたリストの最小/最大関数はどのように機能しますか?

分類Dev

トークン認証は負荷分散されたWebサービスでどのように機能しますか

分類Dev

印刷に関して、ネストされたforループはどのように機能しますか?

分類Dev

ネストされた__try ...__ except句、これはどのように機能しますか?

分類Dev

ネストされたRxJの再試行演算子はどのように機能しますか?

分類Dev

ネストされたコンポーネントはステンシルでどのように機能しますか?

分類Dev

ネストされた共分散は反変性になりますか?

分類Dev

PDOで準備されたステートメントは「内部」でどのように機能しますか?

分類Dev

Haskellでは(共)再帰的定義はどのように機能しますか?

分類Dev

ネストされたヒアドキュメントはbashスクリプトでどのように機能しますか?

分類Dev

ネストされた関数への引数の受け渡しは、Pythonのバックグラウンドでどのように機能しますか?

分類Dev

ネストされたAngularJSng-repeatでBootstrapの折りたたみを正しく機能させるにはどうすればよいですか?

分類Dev

自動除外は、ネストされたウィジェットを持つQRadioButtonでどのように機能しますか?

分類Dev

ネストされたリストに対してジェネリックはどのように機能しますか

分類Dev

.envファイル内のネストされた変数はCodeIgniter4でどのように機能しますか

分類Dev

ネストされた@ RequestMapping-ApacheTilesビューでどのように機能しますか?

分類Dev

保存された会話はDialogflowでどのように機能しますか?

分類Dev

.netCoreのFuncデリゲートで共変性はどのように機能しますか

分類Dev

私はJavaで、kotlinクラスで記述された機能をどのように呼ぶのですか?

分類Dev

別々の列に作成されたインデックスは内部でどのように機能しますか?

分類Dev

dict関数にネストされた美しいforループ:それはどのように機能しますか?

分類Dev

TypeScript:クラスで呼び出されたときにtypeofはどのように機能しますか?

分類Dev

ソートされたメソッドはSwiftでどのように逆に機能しますか?

Related 関連記事

  1. 1

    ネストされたリスト内包表記はPythonでどのように機能しますか?

  2. 2

    ネストされたラムダはラケットでどのように機能しますか?

  3. 3

    ネストされたif / then / elseifはbashでどのように機能しますか?

  4. 4

    ネストされたループはjadeでどのように機能しますか?

  5. 5

    ネストされたforループはC#でどのように機能しますか

  6. 6

    Swiftでオプションの共分散はどのように機能しますか

  7. 7

    ネストされたリストの最小/最大関数はどのように機能しますか?

  8. 8

    トークン認証は負荷分散されたWebサービスでどのように機能しますか

  9. 9

    印刷に関して、ネストされたforループはどのように機能しますか?

  10. 10

    ネストされた__try ...__ except句、これはどのように機能しますか?

  11. 11

    ネストされたRxJの再試行演算子はどのように機能しますか?

  12. 12

    ネストされたコンポーネントはステンシルでどのように機能しますか?

  13. 13

    ネストされた共分散は反変性になりますか?

  14. 14

    PDOで準備されたステートメントは「内部」でどのように機能しますか?

  15. 15

    Haskellでは(共)再帰的定義はどのように機能しますか?

  16. 16

    ネストされたヒアドキュメントはbashスクリプトでどのように機能しますか?

  17. 17

    ネストされた関数への引数の受け渡しは、Pythonのバックグラウンドでどのように機能しますか?

  18. 18

    ネストされたAngularJSng-repeatでBootstrapの折りたたみを正しく機能させるにはどうすればよいですか?

  19. 19

    自動除外は、ネストされたウィジェットを持つQRadioButtonでどのように機能しますか?

  20. 20

    ネストされたリストに対してジェネリックはどのように機能しますか

  21. 21

    .envファイル内のネストされた変数はCodeIgniter4でどのように機能しますか

  22. 22

    ネストされた@ RequestMapping-ApacheTilesビューでどのように機能しますか?

  23. 23

    保存された会話はDialogflowでどのように機能しますか?

  24. 24

    .netCoreのFuncデリゲートで共変性はどのように機能しますか

  25. 25

    私はJavaで、kotlinクラスで記述された機能をどのように呼ぶのですか?

  26. 26

    別々の列に作成されたインデックスは内部でどのように機能しますか?

  27. 27

    dict関数にネストされた美しいforループ:それはどのように機能しますか?

  28. 28

    TypeScript:クラスで呼び出されたときにtypeofはどのように機能しますか?

  29. 29

    ソートされたメソッドはSwiftでどのように逆に機能しますか?

ホットタグ

アーカイブ