当前位置: 首页 > 知识库问答 >
问题:

返回泛型时scala类型擦除

梁丘宏硕
2023-03-14

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

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]] =>

我得到一个警告:“类型模式数组[CustomerInfo到[CustomerApplication到]]中的非变量类型参数CustomerApplication-DDTO未选中,因为它已被擦除消除。”

这是否意味着在Array[]中可以得到任何类型的数组?所以我已经阅读了关于ClassTag和TypeTag的文章,但是误解了如何在我的例子中使用它。你能帮我吗?如何处理这个警告?

共有1个答案

东方宜
2023-03-14

请注意,它抱怨的是CustomerApplication ationIdDTO,而不是CustomerInfoDTOArray是唯一的,因为您实际上可以测试Array[CustomerInfoDTO[_]],因此case arr:Array[CustomerInfoDTO[_]]=

但是,即使您打算说“此函数返回一个< code >数组[CustomerInfoDTO[CustomerApplicationIdDTO]]或一个< code >数组[customeriddo]”,这也不是它所做的;它们的超类型(直到< code>Serializable)也可以在那里,特别是这个函数允许返回一个< code >数组[CustomerInfoDTO[_]]。由于模式匹配无法区分< code > Array[customer info dto[_]]和< code > Array[customer info dto[CustomerApplicationIdDTO]],您会得到一个警告。

您应该考虑一下,作为一个函数而不是两个getCustomer InfoArraygetCustomer IdArray,您实际上可以从中获得什么好处,这将更容易使用。

但是如果你决定这是你想要的,你的选择是:

>

  • 只处理大小写 arr: Array[CustomerInfoDTO[_]] =

    如果您确定无法从该函数中获得数组[CustomerInfo[AnythingElse]],则可以使用case arr:Array[CustomerInfo[CustomerApplicationAddTo]@将其告知编译器=

    正如你所提到的,使用TypeTags或ClassTags,但这会使事情变得更加复杂。

  •  类似资料:
    • 有四种不同的类型:地点、语言、技术和行业。每个类型都有一个存储库,可以返回这些类型的集合。例如位置列表。每个类型都有一个类型为String的name属性。有一个字符串列表。它可以包含位置、语言等名称。我想编写一个函数来查找那些与字符串列表名称匹配的类型实体(位置、语言、...)。我在想这样的事情: 这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?

    • 对于一堆带有泛型的包装类,我的继承结构遇到了一些麻烦。这基本上是结构: 这将与当前代码一起编译和工作,但是,这似乎很危险。如果调用方像这样使用这个方法:,它将很好地编译,但是如果findMiddle尝试返回SubBWrapper,则在运行时会有一个ClassCastException。我以为行得通却行不通的是: 所以我的问题基本上是,有没有正确的方法来编写编译、运行并遵循最佳实践的方法findMi

    • 我想让一个函数返回一个保证实现两个接口的对象。编译时不一定知道确切的对象。我的代码看起来像: 在尝试编译时,我遇到以下错误: 你好世界java:13:错误:不兼容的类型:C无法转换为T 返回新的C() ^ 其中T是一个类型变量: T扩展了方法f(布尔值) HelloWorld中声明的a,B。java:14:错误:不兼容的类型:D无法转换为T 返回新的D() ^ 其中T是一个类型变量: T扩展了方法

    • 我在我的Java程序中写了这个函数: 这就是我所说的: 它是有效的,但我觉得我应该能够省略第一个参数,并从返回类型(结果被分配到的类型)推断出它。这可能吗?如果是,语法是什么?

    • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

    • 问题内容: 我有一个旧类,该类本身不是泛型,但其方法返回类型之一使用泛型: 使用泛型返回字符串的集合。因此,我可以进行遍历,而无需将元素强制转换为: 但是,如果我将自己更改为通用名称,但其他所有内容均保持不变: 然后继续使用对的非泛型引用,不再返回,而是返回非类型。因此,客户端代码无法编译: 为什么是这样?有哪些解决方法? 我的猜测是,通过使用对泛型类的非泛型引用,Java将关闭整个类的所有泛型。