我希望构建一个函数,它使用一个带有一个参数的泛型函数作为输入,而不是基于类型解析参数并调用输入函数:
class PatternMatching {
val a = "test"
def test[T: TypeTag](callback: T => Unit): Unit = {
callback match {
case x if typeOf[T] <:< typeOf[String] => callback(a)
case x if typeOf[T] <:< typeOf[Array[Char]] => callback(a.toCharArray)
case _ => throw new IllegalArgumentException("error")
}
}
} 我认为这种类型是正确推断的,但不可能调用该函数:
类型不匹配;找到: PatternMatching.this.a.type (包含底层类型字符串):t大小写x如果typeOfT <:< typeOfString =>回调(A)
我知道这是在期待一种类型,但我找不到出路。
发布于 2022-08-08 05:17:04
您需要使用您编写的方法显式.asInstanceOf[T]:
callback(a.asInstanceOf[T])不过,您想要达到的目标通常是用Scala中的类型类型来完成。我让读者搜索它,但是一般的想法是,您可以这样定义您的方法:
def test[T](callback: T => Unit)(implicit converter: ConverterFromString[T]): Unit = {
callback(converter.fromString(a))
} 而且,在范围内,只存在一些您知道如何处理的类型的ConverterFromString值。
这种方法的最大好处是类型安全,如果不能处理类型,则会在编译时而不是运行时引发错误。
发布于 2022-08-10 04:53:57
使用@Ga l J works建议的类型:
trait Converter[A] {
def conveterFromString(a: String): A
}
object Converter {
implicit val stringConverter: Converter[String] = new Converter[String] {
def conveterFromString(x: String): String = x
}
implicit val arrayConverter: Converter[Array[Char]] = new Converter[Array[Char]] {
def conveterFromString(x: String): Array[Char] = x.toCharArray
}
}
class PatternMatching {
val a = "test"
def test[A](callback: A => Unit)(implicit converter: Converter[A]): Unit =
callback(converter.conveterFromString(a))
}https://stackoverflow.com/questions/73271026
复制相似问题