Scala 为什么deriveHCons的签名声明“HK<;”Symbol`当Symbol是最终类时

Scala 为什么deriveHCons的签名声明“HK<;”Symbol`当Symbol是最终类时,scala,generics,subclassing,generic-programming,shapeless,Scala,Generics,Subclassing,Generic Programming,Shapeless,以下是Shapeless的LabelledProductTypeClassCompanion中的deriveHCons签名: implicit def deriveHCons[HK <: Symbol, HV, TKV <: HList] (implicit ch: Lazy[C[HV]], key: Witness.Aux[HK], ct: Lazy[Wrap[TKV] { type V <: HList }] ): Wra

以下是Shapeless的
LabelledProductTypeClassCompanion
中的
deriveHCons
签名:

implicit def deriveHCons[HK <: Symbol, HV, TKV <: HList]
    (implicit
      ch: Lazy[C[HV]],
      key: Witness.Aux[HK],
      ct: Lazy[Wrap[TKV] { type V <: HList }]
    ): Wrap.Aux[FieldType[HK, HV] :: TKV, HV :: ct.value.V] = ...

implicit def deriveHCons[HK我将解释为什么这适用于
Int
,但它实际上适用于
Symbol

Int
是final right吗?下面是它的一个实例:

val n = 2
但是我们实际上可以给
n
一个比这个更精确的类型。如何?使用:


现在
n
有type
Witness.`2`.T
,又称
2.type
,或者只是type
2
2
是它的唯一居住者,例如
3:Witness.`2`.T
不会编译。我们有
Witness.`2`.T……你知道
无形状的
…基于类型的通用编程enabl正在处理Scala通常不可能完成的事情。-@SarveshKumarSingh Thx作为指针!仍然不确定我是否完全理解这一切是如何工作的,但我有一个更好理解的起点。代码段需要导入
syntax.singleton.\u
才能编译。
val n: Witness.`2`.T = 2
val s = Symbol("s")
val refined: Witness.`'s`.T = Symbol("s")