作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究 scala 的类型级编程并对其有所了解。但我不知道为什么 class <:< 需要从 (From => To) 扩展,我在 REPL 中编写了以下代码。
trait <:<[-T, +U] // just 'plain' generic trait
// an implicit object will looked up by compiler
implicit def implicitAgent[A]: <:<[A, A] = new <:<[A,A] {}
def myFunc[T,U](one:T, two:U)(implicit ev: T <:< U): Unit = {
println(one, two)
class Base {
override def toString: String = "base"
}
class Derived extends Base {
override def toString: String = "Derived"
}
myFunc(new Derived, new Base)
(Derived,base)
最佳答案
因为那样implicit ev: T <:< U
也作为 T
的隐式转换至 U
可以自动向上转换任何类型的值 T
输入 U
.
与 <:<
定义于 Predef
:
scala> trait Foo
defined trait Foo
scala> def myFunc[T](t: T)(implicit ev: T <:< Foo): Foo = t
myFunc: [T](t: T)(implicit ev: T <:< Foo)Foo
<:<
:
scala> trait <:<[-T, +U]
defined trait $less$colon$less
scala> implicit def implicitAgent[A]: <:<[A, A] = new <:<[A,A] {}
implicitAgent: [A]=> A <:< A
scala> def myFunc[T](t: T)(implicit ev: T <:< Foo): Foo = t
<console>:14: error: type mismatch;
found : T
required: Foo
def myFunc[T](t: T)(implicit ev: T <:< Foo): Foo = t
^
U
的一个实例(即它的类型
T
是类型
U
的子类型)您很可能希望将该值用作
U
的实例。 ,否则你为什么首先需要证明?如
<:<
是一个您可以自动执行此操作的功能。
关于scala - 为什么 class < :<[-From, +To] 需要在 Scala 标准库中扩展 (From => To)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44129643/
我是一名优秀的程序员,十分优秀!