隐式子类型类型类解析:在类中实现Shapeless按类型查找方法
嘿,我这里有几个更简洁的实现方案,能帮你把类D里的get方法写得更清爽:
方案1:直接内联逻辑 + 上下文绑定(最简洁)
如果不想依赖外部的FindByType隐式类,直接把查找逻辑内联到get方法里,同时用上下文绑定简化隐式参数的写法:
sealed trait A class A1 extends A class D(l: Seq[A]) { // 用上下文绑定 [B <: A: Typeable] 代替显式的 implicit 参数 def get[B <: A: Typeable]: Option[B] = l.flatMap(_.cast[B]).headOption }
这样既省去了对外部隐式类的依赖,又让方法签名更干净,完全不用写冗长的implicit typeable: Typeable[B]。
方案2:复用隐式类 + 上下文绑定
如果你想保留外部的FindByType隐式类(方便在其他地方复用),可以先把隐式类的方法改成用上下文绑定,再简化类D里的get方法:
implicit class FindByType[L](l: Seq[L]) { // 隐式类方法也用上下文绑定简化 def findByType[A: Typeable]: Option[A] = l.flatMap(_.cast[A]).headOption } sealed trait A class A1 extends A class D(l: Seq[A]) { // 直接调用简化后的 findByType,方法签名同样清爽 def get[B <: A: Typeable] = l.findByType[B] }
这个方案兼顾了代码复用和简洁性,两边的方法都不用写显式的隐式参数。
对比你原来的写法,这几个方案都去掉了冗余的显式隐式参数声明,要么内联逻辑减少依赖,要么复用隐式类同时简化签名,整体代码更紧凑易读。
内容的提问来源于stack exchange,提问作者azuras
相关产品推荐
相关产品推荐

