当前位置: 首页 > 面试题库 >

Scala Circe与泛型

松元明
2023-03-14
问题内容

我正在尝试使用scala json库Circe,将其包装在一个简单的特征中以提供往返于json的转换,我对此具有以下要求:

import io.circe.generic.auto._
import io.circe.parser._
import io.circe.syntax._

trait JsonConverter {
  def toJson[T](t : T) : String
  def fromJson[T](s: String) : T
}

case class CirceJsonConverter() extends JsonConverter{
  override def toJson[T](t: T): String = t.asJson.noSpaces
  override def fromJson[T](s: String): T = decode[T](s).getOrElse(null).asInstanceOf[T]
}

这样做的目的是简单地能够用任何对象调用JsonConverter并将其转换成json之类的东西jsonConverter.toJson(0) must equalTo("0"),但是当我尝试对其进行编译时,我得到以下信息:

[error] could not find implicit value for parameter encoder: io.circe.Encoder[T]
[error]   override def toJson[T](t: T): String = t.asJson.noSpaces
[error]                                            ^
[error] could not find implicit value for parameter decoder: io.circe.Decoder[T]
[error]   override def fromJson[T](s: String): T = decode[T](s).getOrElse(null).asInstanceOf[T]
[error]                                                     ^
[error] two errors found

我当然可以拥有一个类,打算通过转换器放入的所有内容都继承自该类,但是我有一个印象,大约可以自动生成编码器/解码器?


问题答案:

除非您可以实施将任何对象转换为Json的策略,否则您想要的东西就不会起作用。瑟茜(和许多其他库),而不是选择使用名为类型类的通用模式,使其方便地定义你如何想要做的事,在这种情况下Encoder/
Decoder,对于一个 特定的类型

如果您不熟悉类型类,我建议您对其进行研究。然后查看Circe文档,了解如何专门实现编码器/解码器。



 类似资料:
  • 两者之间有什么区别

  • 问题内容: 我有一个关于Swift中泛型的快速问题。问题是我试图存储一个以泛型为参数的变量,但是无法将其强制转换为它所限制的类型。最好在一个简短的示例中进行解释: 上面的代码产生错误: 因为T被限制为Foo的子类,它 不 应该 永远不会 失败吗?我一定会误解泛型在Swift中的工作方式,任何指导或帮助将不胜感激! 问题答案: Swift泛型不是协变的。就是说,错误确切说明了什么:即使是,您也无法自

  • 问题内容: 当我以为自己终于了解了泛型时,我遇到了以下示例: 它说,如果第1行未注释,则不会编译以下内容: 如果注释了第2行,则不会编译以下内容: 在第二个示例中,允许使用脂肪族及其超类型。那么为什么不允许脂肪族? 在第一个示例中,为什么不允许? 第一个编译器错误: 第二编译器错误: 问题答案: 您的第一个声明 表示 可能 是一个(因为extends ,extends 和extended )。 在

  • 问题内容: 我使用整数对选择进行排序,并且可以正常工作,当我尝试修改程序以使用泛型时,编译器会抱怨并且我不知道如何解决它。如果有人能提出一些建议和建设性的意见,我将不胜感激。这是代码。 以下是吐出来的东西。 cannot be applied to given types; printArray(list); ^ required: E[] found: int[] reason: inferre

  • 问题内容: 我想知道以下两个方法声明之间有什么区别: 有什么可以/可以做的,而不是另一种?我在本网站的其他地方找不到这个问题。 问题答案: 与上下文隔离-没有区别。在和两者上,您只能调用的方法。 但是有上下文-如果您有泛型类: 然后: 与对象相同的代码 两个优点: 无需强制转换(编译器向您隐藏了此内容) 编译有效的时间安全性。如果使用的是版本,则不能确保方法始终返回。如果返回,则在运行时会有一个。

  • 泛型用于通常我们放置类型的位置,比如函数签名或结构体,允许我们创建可以代替许多具体数据类型的结构体定义。让我们看看如何使用泛型定义函数、结构体、枚举和方法,并且在本部分的结尾我们会讨论泛型代码的性能。 定义函数时可以在函数签名的参数数据类型和返回值中使用泛型。以这种方式编写的代码将更灵活并能向函数调用者提供更多功能,同时不引入重复代码。 回到 函数上,示例 10-4 中展示了两个提供了相同的寻找