我有一个返回泛型的函数:
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
,而不是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
s或ClassTag
s,但这会使事情更加复杂。