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 _ =>
}
}
}