我有一个返回泛型的函数:
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的文章,但误解了如何在我的情况下使用它。那你能帮我吗?如何处理此警告?
答案 0 :(得分:0)
请注意,它抱怨的是CustomerApplicationIdDTO
,而不是CustomerInfoDTO
:Array
的独特之处在于您可以实际测试Array[CustomerInfoDTO[_]]
,因此case arr: Array[CustomerInfoDTO[_]] =>
不会示警。
但是,即使您打算说“此函数返回Array[CustomerInfoDTO[CustomerApplicationIdDTO]]
或Array[CustomerIdDTO]
”,也并非如此。它们的超类型(最多也可以是Serializable
,特别是允许该函数返回Array[CustomerInfoDTO[_]]
。由于模式匹配无法区分Array[CustomerInfoDTO[_]]
和Array[CustomerInfoDTO[CustomerApplicationIdDTO]]
,您会收到警告。
您应该考虑从一个简单的函数而不是两个更简单易用的getCustomerInfoArray
和getCustomerIdArray
所带来的实际好处。
但是,如果您确定它是您想要的,则您可以选择:
仅处理case arr: Array[CustomerInfoDTO[_]] =>
。
如果您确定不会从此函数中获得Array[CustomerInfoDTO[AnythingElse]]
,则可以使用case arr: Array[CustomerInfoDTO[CustomerApplicationIdDTO]] @unchecked =>
告诉编译器(我想;也许您需要Array[CustomerInfoDTO[CustomerApplicationIdDTO @unchecked]]
)
使用TypeTag
或ClassTag
s,但这会使事情变得更加复杂。