Why does the signature of deriveHCons declare `HK <: Symbol` when Symbol is a final class <p>Here is the signature of <code>deriveHCons</code> in <code>LabelledProductTypeClassCompanion</code> of Shapeless:</p> <pre><code>implicit def deriveHCons[HK &lt;: Symbol, HV, TKV &lt;: HList] (implicit ch: Lazy[C[HV]], key: Witness.Aux[HK], ct: Lazy[Wrap[TKV] { type V &lt;: HList }] ): Wrap.Aux[FieldType[HK, HV] :: TKV, HV :: ct.value.V] = ... </code></pre> <p>It seems strange to me that we declare a type parameter <code>HK</code> that must derive from <code>Symbol</code> when <code>Symbol</code> is a final class. How can anything but <code>Symbol</code> replace the type parameter <code>HK</code>? If <code>HK</code> is always <code>Symbol</code>, this signature would be less imposing if it got rid of HK and substituted Symbol in the type signature directly would it not?</p>