我想编写一个函数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 + " ")
}
}