scala - 如何对所有具有上下文绑定的类进行模式匹配
问题描述
我有一个类型类和一些实例:
trait TC[T] { def doThings(x: T): Unit }
implicit val tcA = new TC[A] { /* ... */}
implicit val tcB = new TC[B] { /* ... */}
implicit val tcC = new TC[C] { /* ... */}
/* ... */
在我的呼叫站点中,我输入为 Any,我需要检查输入实际类型是否存在隐式:
def process(in: Any) = in match {
case x: A => implicitly[TC[A]].doThings(x)
case x: B => implicitly[TC[B]].doThings(x)
case x: C => implicitly[TC[C]].doThings(x)
//...
}
这似乎乏味且不必要,因为我必须列出所有具有此类型类实例的类。我可以通过以下方式实现这一目标:
def process(in: Any) = in match {
case x: T : TC => implicitly[TC[T]].doThings(x) //This does not work
}
编辑:输入是 Any(Java 库中的对象)。不能在输入上使用泛型或上下文绑定。
解决方案
如果你真的想做你在问题中提到的事情,你可以写如下,但如果你只想通过找到适当 TC 的隐式实例来调用 doThings - 请参阅 João Guitana 答案
object Main extends App {
class A
class B
class C
trait TC[T] { def doThings(x: T): Unit }
implicit val tcA = new TC[A] {
override def doThings(x: A): Unit = println("From A")
}
implicit val tcB = new TC[B] {
override def doThings(x: B): Unit = println("From B")
}
implicit val tcC = new TC[C] {
override def doThings(x: C): Unit = println("From C")
}
def process[T: ClassTag](in: T) = in match {
case x: A => implicitly[TC[A]].doThings(x)
case x: B => implicitly[TC[B]].doThings(x)
case x: C => implicitly[TC[C]].doThings(x)
}
process(new A())
process(new B())
process(new C())
}
/* === Output ====
From A
From B
From C
*/
推荐阅读
- javascript - 在javascript中将带有时区的日期时间转换为UTC
- javascript - 如何使星期一只能从odoo中的canlendar中选择?
- r - 使用 lme4/R:从 glmer 输出计算 OR
- asp.net - 网站访问者计数在服务器(云窗口服务器)上不起作用。如何修复它?
- google-apps-script - doGet() 的配额限制
- python - 添加为子目录时找不到导入
- python - 奇怪的 Python 日期比较行为
- c# - 目录和子目录路径不起作用
- wordpress - Wordpress 后端表单返回 JSON
- ms-word - INCLUDEPICTURE 字段中的相对路径有时会以某种方式更改为绝对路径