You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

隐式子类型类型类解析:在类中实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:24:28