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

Scala中泛型返回类型的模式匹配

段干安和
2023-03-14

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

def find[T](names: String): Set[T] = {
  val collection = T match {
    case Language => LanguageRepository.getAll
    case Location => LocationRepository.getAll
    case Teehnology => TechnologyRepository.getAll
    case Industry => IndustryRepository.getAll
  }
  // find the elements in the collection
}

这是不正确的,那么如何对集合进行查询,然后如何确定name属性是否存在呢?

共有1个答案

越英韶
2023-03-14

为什么不为此使用代数数据类型呢?它们可以用作枚举。示例:

sealed trait Property
case object LanguageProperty extends Property
case object LocationProperty extends Property
case object TechnologyProperty extends Property
case object IndustryProperty extends Property

def find(names: String, property: Property): Set[ParentClass] = {
  val collection = property match {
    case LanguageProperty => LanguageRepository.getAll
    case LocationProperty => LocationRepository.getAll
    case TechnologyProperty => TechnologyRepository.getAll
    case IndustryProperty => IndustryRepository.getAll
  }
  // find the elements in the collection
}

这意味着ParentClassLanguageLocationTechnologyIndustry类的父类。

 类似资料:
  • 我有一个返回泛型的函数: 所以,当我试图匹配一个函数结果时,我的问题是: 我得到一个警告:“类型模式数组[CustomerInfo到[CustomerApplication到]]中的非变量类型参数CustomerApplication-DDTO未选中,因为它已被擦除消除。” 这是否意味着在Array[]中可以得到任何类型的数组?所以我已经阅读了关于ClassTag和TypeTag的文章,但是误解了

  • 假设我们有一个泛型类: 然后,我们希望将与和的进行模式匹配:

  • 我有一个从提取的代码,对于多个子类来说,这个代码看起来应该完全相同,所以我尽量避免重复。但是,实际上(见下文),scala认为是一个泛型的,返回的值类型为,当然,它没有和方法。 问题是在这里避免重复的适当方法是什么?我对将转换为字符串并不那么着迷,因为这段代码可以使用刚从字符串解析为AST的json。我开始考虑为我需要的三种类型编写包装器,并将这些类型的匹配和隐式转换器转换为包装器,然后为这些包装

  • 可以使用泛型将返回类型与参数类型匹配吗? 实例案例: 我有一个抽象类,可以从不同的POJO导入数据,这个类包含一个abstract方法importData。 importData返回的对象必须与传递给该方法的对象类型相同。 由于抽象方法的每个实现的对象类型不同,并且类型不扩展另一个,如何定义抽象方法,以便实现返回类型和传递类型必须匹配? 经过考验: 结果: 方法的返回类型不必与传递的对象类型匹配。

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

  • 我想消除此示例代码中的类型擦除警告: 它编译和工作正常,但有一个警告: 警告:(31,13)类型模式Seq[Int](Seq[Int]的底层)中的非变量类型参数Int未选中,因为它被擦除情况b消除:Seq[Int]= 在这种情况下,你有什么简单的解决方案来避免擦除吗? 到目前为止,我尝试了什么(根据这一点): 但是它不能编译,因为c现在是Any类型。 我相信这个问题有几种解决方法。我会接受最简单的