Scalaはどのようにしてジェネリック型を自動的に解決しますか?

トマー・シェタ:

次の2行のコードを検討してください。

def foo[F[B],A](fa: F[A]): String = fa.toString
println(foo(10))

印刷し10ます。どういうふうにコンパイルできるのかしら。Scalaがここでジェネリックを解決する方法を理解しようとしています。つまり、A、B、Fとは何ですか。

Intellijを見ると、10はScala IntからJava Integerに変換されているようです。しかし、Java IntegerがどのようにF [A]に変換されるのか(Java Integerはジェネリック型ではありません)は、foo期待どおりにわかりません

マリオガリック:

fooが受け取ることを想定しているJava IntegerからF [A](Java Integerはジェネリック型ではない)への変換方法。

Java IntegerはのサブタイプですComparable[Integer]

public final class Integer extends Number implements Comparable<Integer>

Scala 2.13推論F = AnyA = Nothing

scala> def foo[F[_],A](fa: F[A]) = fa
def foo[F[_], A](fa: F[A]): F[A]

scala> foo(10) // print
foo[Any, Nothing](10) // : Any
scala> foo(10)
val res9: Any = 10

この推論は、暗黙の変換が存在するために発生します

implicit def int2Integer(x: Int): java.lang.Integer = x.asInstanceOf[java.lang.Integer]

この変換を非表示にすると、コンパイルされません

scala> implicit val int2Integer = null
val int2Integer: Null = null

scala> foo(10)
       ^
       error: no type parameters for method foo: (fa: F[A]): F[A] exist so that it can be applied to arguments (Int)
        --- because ---
       argument expression's type is not compatible with formal parameter type;
        found   : 10
        required: ?F[?A]
           ^
       error: type mismatch;
        found   : Int(10)
        required: F[A]

ただしint2Integer、コンパイルしたという事実にもかかわらず、暗黙の変換は実際には行われませんでした(バグの可能性があります)。

scala> foo(10)
val res9: Any = 10

代わりにとres9入力する必要があった場所Comparable[Integer]Any

スカラ3(義母)推論F = ComparableA = Integerの通り-Xprint:typer

foo[Comparable, Integer](int2Integer(10))

そして暗黙の変換が実際に適用されます

Starting dotty REPL...
scala> def foo[F[_],A](fa: F[A]) = fa
def foo[F[_$1], A](fa: F[A]): F[A]

scala> foo(10)
val res0: Comparable[Integer] = 10

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

Scalaはどのようにしてジェネリック型を自動的に解決しますか?

分類Dev

Scalaマクロの型チェックはどのようにして識別子を型に解決しますか?

分類Dev

Flowはジェネリック型をどのように解釈しますか?

分類Dev

Springのジェネリック型に基づく自動配線。どのように機能しますか?

分類Dev

getClass()。getName()はどのようにしてジェネリック型のクラス名を返しますか?

分類Dev

circeはジェネリック型オブジェクトをJsonにどのように解析しますか?

分類Dev

ジェネリック型はscalaの継承でどのように機能しますか?

分類Dev

ジェネリック型がジェネリック型参照として渡されるときに、C#は(どういうわけか)型制約自体を解決できますか?

分類Dev

c#はネストされた(ジェネリック)型をどのように処理しますか?

分類Dev

Swiftでは、メソッドはどのようにジェネリック型を返しますか?

分類Dev

どのように私は、ジェネリック型のインスタンスを作成しますか?

分類Dev

ジェネリック型は型階層にどのように適合しますか?

分類Dev

Jacksonはどのようにしてjsonをジェネリック型に逆シリアル化しますか?

分類Dev

WordPressはパブリックURLをページにどのように解決しますか?

分類Dev

錆びた特性を含むジェネリック型にderefをどのように実装しますか?

分類Dev

Javaでジェネリック型のメソッドをどのように呼び出しますか?

分類Dev

JDK 8の型推論はジェネリックでどのように機能しますか?

分類Dev

ジェネリック型変数を既知の型にどのように割り当てますか?

分類Dev

デコレータを使用してクラスジェネリック型の実行時型を取得するにはどうすればよいですか?

分類Dev

複数のジェネリック型パラメーターを使用して型を作成するにはどうすればよいですか

分類Dev

IntelliJを使用してScalaの例外をどのように解決しますか?

分類Dev

ジェネリックのジェネリックはどのように機能しますか?

分類Dev

Javaでジェネリックを使用してネストされた型をどのように参照しますか?

分類Dev

ジェネリックは列挙型によってどのように管理されますか?

分類Dev

typescriptはどのようにしてオブジェクトの型を現在の値の型にしますか?

分類Dev

Cloud Data Fusionは、dataprocリソースに使用するプロジェクトネットワークをどのように決定しますか?

分類Dev

変数の型(ジェネリックかどうか)は、属性の動作を変更します

分類Dev

C#ジェネリックはどのように機能しますか?

分類Dev

結果の型の文字列値としてジェネリックのクラス名を使用するにはどうすればよいですか

Related 関連記事

  1. 1

    Scalaはどのようにしてジェネリック型を自動的に解決しますか?

  2. 2

    Scalaマクロの型チェックはどのようにして識別子を型に解決しますか?

  3. 3

    Flowはジェネリック型をどのように解釈しますか?

  4. 4

    Springのジェネリック型に基づく自動配線。どのように機能しますか?

  5. 5

    getClass()。getName()はどのようにしてジェネリック型のクラス名を返しますか?

  6. 6

    circeはジェネリック型オブジェクトをJsonにどのように解析しますか?

  7. 7

    ジェネリック型はscalaの継承でどのように機能しますか?

  8. 8

    ジェネリック型がジェネリック型参照として渡されるときに、C#は(どういうわけか)型制約自体を解決できますか?

  9. 9

    c#はネストされた(ジェネリック)型をどのように処理しますか?

  10. 10

    Swiftでは、メソッドはどのようにジェネリック型を返しますか?

  11. 11

    どのように私は、ジェネリック型のインスタンスを作成しますか?

  12. 12

    ジェネリック型は型階層にどのように適合しますか?

  13. 13

    Jacksonはどのようにしてjsonをジェネリック型に逆シリアル化しますか?

  14. 14

    WordPressはパブリックURLをページにどのように解決しますか?

  15. 15

    錆びた特性を含むジェネリック型にderefをどのように実装しますか?

  16. 16

    Javaでジェネリック型のメソッドをどのように呼び出しますか?

  17. 17

    JDK 8の型推論はジェネリックでどのように機能しますか?

  18. 18

    ジェネリック型変数を既知の型にどのように割り当てますか?

  19. 19

    デコレータを使用してクラスジェネリック型の実行時型を取得するにはどうすればよいですか?

  20. 20

    複数のジェネリック型パラメーターを使用して型を作成するにはどうすればよいですか

  21. 21

    IntelliJを使用してScalaの例外をどのように解決しますか?

  22. 22

    ジェネリックのジェネリックはどのように機能しますか?

  23. 23

    Javaでジェネリックを使用してネストされた型をどのように参照しますか?

  24. 24

    ジェネリックは列挙型によってどのように管理されますか?

  25. 25

    typescriptはどのようにしてオブジェクトの型を現在の値の型にしますか?

  26. 26

    Cloud Data Fusionは、dataprocリソースに使用するプロジェクトネットワークをどのように決定しますか?

  27. 27

    変数の型(ジェネリックかどうか)は、属性の動作を変更します

  28. 28

    C#ジェネリックはどのように機能しますか?

  29. 29

    結果の型の文字列値としてジェネリックのクラス名を使用するにはどうすればよいですか

ホットタグ

アーカイブ