首页 > 解决方案 > 在 Scala 中用 <: 和 <:< 表示子类型关系

问题描述

通常,我使用 <: 来表示像 A <: B 这样的子类型关系,既可以作为类型参数的一部分,也可以作为类型成员。在浏览一些东西时,我遇到了这个“<:<”表示。在 Predef.scala 中找到它,令人惊讶的是,它被定义为一个抽象类。医生说:

A <:< B见证人的一个实例,它A是 的子类型B。要求类型的隐式参数对A <:< B广义约束进行编码A <: B

鉴于两者都代表相同的“子类型”关系(AFAIK),有人可以澄清一下两者之间的区别究竟是什么。另外,请建议它们的正确用法(我的意思是, <:< 优于 <:) ?

标签: scala

解决方案


[A <: B]声明A具有已知属性/限制的类型参数 :它必须是类型B(现有类型)或其子类型。

class A  // A and B are unrelated
class B

// these both compile
def f1[A <: B]() = ???  // A is the type parameter, not a reference to class A
def f2[B <: A]() = ???  // B is the type parameter, not a reference to class B

[A <:< B]用于测试现有类型。

class B
class A extends B

// A and B must already exist and have this relationship or this won't compile
implicitly[A <:< B]

推荐阅读