返回泛型时的scala类型擦除

时间:2018-11-07 04:17:27

标签: scala

我有一个返回泛型的函数:

def getArray(tag: Tags, arr: Option[Array[SearchHit]]
): Array[_ >: CustomerInfoDTO[CustomerApplicationIdDTO] with CustomerIdDTO <: Serializable] = arr match {
    case Some(s) =>
      tag match {
        case GetCustomersInfo =>
          s.map(x => extractCustomerInfo(x.sourceAsString))
        case GetCustomersId =>
          s.map(x => extractCustomerId(x.sourceAsString))
        case _ => throw new NoSuchElementException("Can't match tag")
      }
    case None => throw new NoSuchElementException("Empty Array")
  }

所以,当我尝试匹配功能结果时遇到的问题:

case arr: Array[CustomerInfoDTO[CustomerApplicationIdDTO]] =>

我收到警告“未选中类型模式Array [CustomerInfoDTO [CustomerApplicationIdDTO]]中的非变量类型参数CustomerApplicationIdDTO,因为它已通过擦除将其消除了”

这是否意味着在Array []中可以获取任何类型的数组?因此,我已阅读有关ClassTag和TypeTag的文章,但误解了如何在我的情况下使用它。那你能帮我吗?如何处理此警告?

1 个答案:

答案 0 :(得分:0)

请注意,它抱怨的是CustomerApplicationIdDTO,而不是CustomerInfoDTOArray的独特之处在于您可以实际测试Array[CustomerInfoDTO[_]],因此case arr: Array[CustomerInfoDTO[_]] =>不会示警。

但是,即使您打算说“此函数返回Array[CustomerInfoDTO[CustomerApplicationIdDTO]]Array[CustomerIdDTO]”,也并非如此。它们的超类型(最多也可以是Serializable,特别是允许该函数返回Array[CustomerInfoDTO[_]]。由于模式匹配无法区分Array[CustomerInfoDTO[_]]Array[CustomerInfoDTO[CustomerApplicationIdDTO]],您会收到警告。

您应该考虑从一个简单的函数而不是两个更简单易用的getCustomerInfoArraygetCustomerIdArray所带来的实际好处。

但是,如果您确定它是您想要的,则您可以选择:

  1. 仅处理case arr: Array[CustomerInfoDTO[_]] =>

  2. 如果您确定不会从此函数中获得Array[CustomerInfoDTO[AnythingElse]],则可以使用case arr: Array[CustomerInfoDTO[CustomerApplicationIdDTO]] @unchecked =>告诉编译器(我想;也许您需要Array[CustomerInfoDTO[CustomerApplicationIdDTO @unchecked]]

  3. 正如您提到的,
  4. 使用TypeTagClassTag s,但这会使事情变得更加复杂。