在类型具有Show实例的位置连接多个值



我想编写一个函数showAll,它接受值的List,并使用隐式范围中可用的Show实例,通过连接每个值的String表示来生成String

除了Show实例的存在之外,列表中元素的类型不应该有任何约束。

例如:

case class Person(name: String)
implicit val showPerson: Show[Person] = Show.by(_.name)
showAll(List(1, Person("Martin")))

应输出:

1 Martin

在这种情况下,函数使用Show[Int]Show[Person]实例。

什么是函数的正确签名?

谢谢。

这是我的示例代码,它可能解决了您的问题。我已经创建了一个通用方法showall,根据您的需要来显示List的元素。也是用于特定字段值的隐式方法。MyClass跟踪是标识符。如果Myclass在任何情况下都不会扩展,则不会打印特定于类的字段。

trait Myclass
case class Person(name: String) extends Myclass
case class Admin(name: String,age:Long) extends Myclass
def main(args: Array[String]): Unit = {
showAll[Myclass](List(1, 2, Person("Martin"),Admin("Bob",30)))
}
implicit def showField: String = "name"
def showAll[T <: Myclass : ClassTag](listOfValues: List[Any]): Unit = {
listOfValues.foreach { data =>
if (data.isInstanceOf[T]) {
val myInstance= data.asInstanceOf[T]
val fld = myInstance.getClass.getDeclaredField(showField)
fld.setAccessible(true)
val value = fld.get(myInstance).asInstanceOf[String]
print(value + " ")
}
else
print(data + " ")
}
}

最新更新