gpt4 book ai didi

Scala Case Class Companion Objects - 类型名称冲突

转载 作者:行者123 更新时间:2023-12-01 09:45:49 26 4
gpt4 key购买 nike

我遇到了 Companion Objects 选择其类型而不是 case 类的问题

我正在使用喷雾 json serdes。他们需要一个隐式的 JsonFormat。这种格式是通过调用一个依赖于案例类的参数数量的函数获得的: jsonFormat2(Class2) 如果案例类有两个字段,比如

case class Class2(a: String, b: Integer)

或 jsonFormat3(Class3) 为
case class Class3(a: String, b: Integer, c: Long)

鉴于必须知道您的案例类在整个代码中的参数数量并不好,我想制作一个案例类伴侣对象,以便您可以封装此信息并从类本身获取 JsonFormat,例如:
object Class2 extends DefaultJsonProtocol 
{
def getJsonFormat() = {
jsonFormat2(Class2)
}
}

但是如果我这样做,我会得到以下编译问题:
type mismatch;
[error] found : mypackage.Class2.type
[error] required: (?, ?) => ?
[error] jsonFormat2(Class2)

如果我们查看jsonFormat2中的代码,签名是:
def jsonFormat2[P1 :JF, P2 :JF, T <: Product :ClassManifest
(construct: (P1, P2) => T): RootJsonFormat[T] = { // ...

如果我更改伴随对象名称(例如更改为 MyClass2),它将正常工作。所以,似乎类型是冲突的。

似乎在处理打字时,伴生对象无法像它们一起使用的类那样命名。

有人可以解释为什么会发生这种情况,如果有限制,或者如何解决,以便可以使用同名的伴生对象?

最佳答案

Class2 的伴随对象时隐式定义,它扩展 (String, Integer) => Class2 ;你的版本没有。如果你改为

object Class2 extends DefaultJsonProtocol with (String, Integer) => Class2 { ... }

它会起作用,但为了避免重复参数类型,我会采用 Andrey Tyukin 的建议(即使解释不正确)。

关于Scala Case Class Companion Objects - 类型名称冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49073857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com