Scala擦除类类型参数

Scala擦除类类型参数,scala,type-parameter,erasure,Scala,Type Parameter,Erasure,我有以下设置: class Test[A](function: A => String) { def process(data: Any) { //has to be Any since it is user IO if (data of Type A) function(data) } } 我似乎无法让打字机工作。 我尝试添加一个隐式类型标记来测试[A],但无法从进程中访问它。 是否可以与过程功能内的测试类型参数匹配?使用:

我有以下设置:

class Test[A](function: A => String) {
   def process(data: Any) {         //has to be Any since it is user IO
      if (data of Type A) 
          function(data)
   }
}
我似乎无法让打字机工作。 我尝试添加一个隐式类型标记来测试[A],但无法从进程中访问它。 是否可以与过程功能内的测试类型参数匹配?

使用:


这一个是安全的,因为它返回一个选项[A],因此当强制转换失败时,您可以在None上进行模式匹配。

我不确定为什么
数据
必须是
Any
类型(用户输入不应该是
字符串
?),但如果确实是这样,然后,它可能反映了在编译时无法预期类型的情况。在这种情况下,您可能希望该方法在尝试强制转换时抛出运行时错误:

class Test[A](function: A => String) {
   def process(data: Any) = {
      function(data.asInstanceOf[A]) //might throw an error
   }
}
或者可以使用
Try
monad:

class Test[A](function: A => String) {
   def process(data: Any) = {
      Try(function(data.asInstanceOf[A]))
   }
}
当然,最好是在编译时知道
数据的类型:

class Test[A](function: A => String) {
   def process(data: A) = {
      function(data)
   }
}

为此,请使用
ClassTag
match

import scala.reflect.ClassTag

class Test[A : ClassTag](function: A => String) {
  def process(data: Any) { //has to be Any since it is user IO 
    data match {
      case data: A => function(data)
      case _       =>
    }
  }
}

由于作用域中的隐式
ClassTag
match
可以区分
A
,即使它是通用的。

谢谢您的回答!标准库中有什么东西可以实现同样的功能吗?“标准库”(
data.isInstanceOf[A]
data.asInstanceOf[A]
)只能部分工作,直到擦除为止。因此,您将无法匹配
列表[Int]
列表[String]
,它将只是一个
列表[\uU]
,可能导致运行时抛出的
instanceOf
ClassCastException
的误报。对于较新的scala版本,您可以使用捕获完整类型的类型标签:我似乎无法让它工作。非常好!我非常接近:-)但不是每个人都是这样。它在没有警告的情况下编译,但在运行时案例数据:A匹配任何内容
import scala.reflect.ClassTag

class Test[A : ClassTag](function: A => String) {
  def process(data: Any) { //has to be Any since it is user IO 
    data match {
      case data: A => function(data)
      case _       =>
    }
  }
}