我有一个通用的解析器方法,它从某个源读取数据,并将其转换为适当的类型。为了举例,想象一下这样的事情:
def readStuff[T : Manifest](input: Seq[String]): Т = {
val constructor = manifest
.runtimeClass
.getConstructors
.head
val params = constructor
.getParameterTypes
.zip(input)
.map { case (clazz, str) => toType(str, clazz) }
constructor.newInstance(params).asInstanceOf[T]
}
现在,我想为调用者添加一个能够传递一些额外的验证/按摩逻辑的功能,这样我就可以这样写:
case class Person(
firstName: String,
lastName: String,
middleName: String,
age: Int
)
readStuff[MyStuff](inputs) {
case (0|1, s) => require(s.nonEmpty); s
case (2, s) if s == null => ""
case (_, x: Int) => require(x > 0); x
case x => x
}
问题是如何定义validator
参数?
这几乎看起来像这样:
def readStuff[T](inputs: Seq[String])(validator: PartialFunction[(Int, Any), Any])
除了我需要以某种方式要求第一个Any
和第二个Any
是相同的(尽管是未知的)类型(以便验证器的输出必须是输入的类型相同。)
有什么想法吗?