首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Scala解析函数的泛型参数

Scala解析函数的泛型参数
EN

Stack Overflow用户
提问于 2022-08-07 21:01:03
回答 2查看 50关注 0票数 0

我希望构建一个函数,它使用一个带有一个参数的泛型函数作为输入,而不是基于类型解析参数并调用输入函数:

代码语言:javascript
复制
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)

我知道这是在期待一种类型,但我找不到出路。

EN

回答 2

Stack Overflow用户

发布于 2022-08-08 05:17:04

您需要使用您编写的方法显式.asInstanceOf[T]

代码语言:javascript
复制
callback(a.asInstanceOf[T])

不过,您想要达到的目标通常是用Scala中的类型类型来完成。我让读者搜索它,但是一般的想法是,您可以这样定义您的方法:

代码语言:javascript
复制
def test[T](callback: T => Unit)(implicit converter: ConverterFromString[T]): Unit = {
  callback(converter.fromString(a))
}      

而且,在范围内,只存在一些您知道如何处理的类型的ConverterFromString值。

这种方法的最大好处是类型安全,如果不能处理类型,则会在编译时而不是运行时引发错误。

票数 1
EN

Stack Overflow用户

发布于 2022-08-10 04:53:57

使用@Ga l J works建议的类型:

代码语言:javascript
复制
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))
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73271026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档