避免类型擦除警告

时间:2013-11-05 20:23:33

标签: scala

我有一些代码,我有一组函数。每个函数可能有1个或2个参数。迭代这些函数时,我检查元素是否为Function1或Function2类型。问题是我开始获取类型擦除警告,因为我必须定义参数数据类型以便编译它(例如,Function2 [String,Int] - 参见下面的示例警告+)。

据我所知,Java在编译时会剥离参数类型信息,因此它无法与我定义的Function2进行模式匹配。问题是,我只想测试函数是否为Function1或Function2类型,从那里我知道我需要传递给函数的数据类型。我尝试将它们定义为ex。 Function2 [Any,Any]和Function2 [Object,Object],但这些都没有抑制警告。有没有办法模拟匹配不同参数计数的函数而不要求它也检查参数类型?

[warn] /home/ubuntu/aa-2-0/src/main/scala/hw.scala:818: non-variable type argument Any in type Any => Any is unchecked since it is eliminated by erasure
[warn]                  else if(col_data.isInstanceOf[Function1[Any,Any]])  mapped_data+= col -> col_data.asInstanceOf[Function1[Any,String]].apply(page)
[warn]                                               ^
[warn] /home/ubuntu/aa-2-0/src/main/scala/hw.scala:819: non-variable type argument Any in type (Any, Any) => Any is unchecked since it is eliminated by erasure
[warn]                  else if(col_data.isInstanceOf[Function2[Any,Any,Any]]) mapped_data+= col -> col_data.asInstanceOf[Function2[Any,Any,String]].apply(result_row,page)

我知道有反射和标签以及所有这些,但那些看起来像丑陋和过于精细的黑客来解决我相当琐碎的问题。相反,我打算在FunctionOne,FunctionTwo案例类中封装这些函数然后只测试那些,但是想先看看是否有更优雅的解决方案可供学习。

1 个答案:

答案 0 :(得分:2)

我不会制作不同功能类型的各种列表,这会给你这个问题。但如果必须,可以使用通配符:

if(col_data.isInstanceOf[Function1[_,_]])

(您也可以使用加糖符号_ => _(_,_) => _等。)