我有一些代码,其中有一个函数集合。每个函数可能有一个或两个参数。在迭代这些函数时,我检查元素是Function1类型还是Function2类型。问题是,我开始获得类型擦除警告,因为我必须定义参数数据类型才能进行编译(例如。Function2String,Int --参见警告below+示例)。
我了解到,当参数类型信息被编译时,Java会将其剥离掉,因此它不能与我定义的Function2模式匹配。问题是,我只想测试函数是Function1类型还是Function2类型,从那里我知道需要传递给函数的数据类型。我试过把他们定义为前任。Function2Any,Any和Function2Object,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案例类中,然后只对这些函数进行测试,但我想先看看是否有更优雅的解决方案需要学习。
发布于 2013-11-05 20:42:32
我不会列出不同函数类型的分类列表,这给您带来了这个问题。但是如果必须的话,可以使用通配符:
if(col_data.isInstanceOf[Function1[_,_]])(您还可以使用含糖符号_ => _、(_,_) => _等)
https://stackoverflow.com/questions/19798215
复制相似问题