【问题标题】:Avoiding type erasure warnings避免类型擦除警告
【发布时间】:2013-11-06 04:42:32
【问题描述】:

我有一些代码,其中有一组函数。每个函数可能有 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 案例类中,然后只测试它们,但想先看看是否有更优雅的解决方案可以学习。

【问题讨论】:

    标签: scala


    【解决方案1】:

    我不会列出不同函数类型的分类列表,这会给您带来这个问题。但如果必须,您可以使用通配符:

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

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

    【讨论】:

    • 这很完美——谢谢!我同意它可能不是“最佳实践”,但在这种情况下,我有很多函数定义应该应用于输入数据库的不同数据列。我发现查找每列是否存在函数比必须为正在操作的每个可能的列编写匹配/案例语句要简洁得多。
    猜你喜欢
    • 2012-01-17
    • 2018-06-18
    • 2019-10-04
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多