返回泛型时使用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,但误解了在我的情况下如何使用它。你能帮我吗?如何处理此警告?

请注意,它抱怨的是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. 正如您所提到的,使用TypeTags或ClassTags,但这会使事情更加复杂。

最新更新