gpt4 book ai didi

scala - Scala 如何自动解析泛型类型?

转载 作者:行者123 更新时间:2023-12-04 02:32:19 24 4
gpt4 key购买 nike

请考虑以下两行代码:

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 期望接收。

最佳答案

how the Java Integer is converted to any F[A](Java Integer is not generic type), as foo expects to receive.

Java IntegerComparable[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

Scala 3 (Dotty) 根据 -Xprint:typer 推断 F = ComparableA = Integer

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

关于scala - Scala 如何自动解析泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63572980/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com