Scala 调用方法时如何指定类型?

Scala 调用方法时如何指定类型?,scala,types,Scala,Types,我很难理解如何使此方法可重用: trait T case class A extends T case class B extends T def deserialize(source:Json):A = { source.convertTo[A] } .convertTo[x]方法可以同时转换为A和B;然而,目前这种方法只能产生A。调用方法时,如何指定要转换为的类型 澄清: 目前我可以这样做,但这是多余的,特别是当T子类的数量增加时: def deserialize_A_(source

我很难理解如何使此方法可重用:

trait T
case class A extends T
case class B extends T

def deserialize(source:Json):A = {
  source.convertTo[A]
}
.convertTo[x]
方法可以同时转换为
A
B
;然而,目前这种方法只能产生
A
。调用方法时,如何指定要转换为的类型

澄清:

目前我可以这样做,但这是多余的,特别是当
T
子类的数量增加时:

def deserialize_A_(source:Json):A = {
  source.convertTo[A]
}
def deserialize_B_(source:Json):B = {
  source.convertTo[B]
}
如何将这两个方法合并为一个,以便它能够处理
T
的所有子类?(注意:假设嵌套方法
convertTo
已经可以处理所有这些子类。)

因为展示比解释容易(我认为我写的方式行不通):


我不确定您使用的是什么库,但如果您查看
convertTo
类型签名,您将看到需要做什么。例如,spray json有一个
convertTo
方法,如下所示:

def convertTo[T : JsonReader]: T
def deserialize[X <: T : JsonReader](source:Json): X = {
  source.convertTo[X]
}
符号
T:JsonReader
是一个上下文绑定,这是一个语法糖:

def convertTo[T](implicit $ev : JsonReader[T]): T
因此,基本上,您需要接收一个类型参数(如上面的
T
),以及基于该类型参数的隐式值,其类型取决于您正在使用的库所需的
convertTo
。假设它是
JsonReader
,那么您的方法变成:

def deserialize[X : JsonReader](source:Json): X = {
  source.convertTo[X]
}
您需要这样调用,因为无法推断
X

deseralize[A](someSource)
如果需要将
X
作为
T
的子类型,可以添加如下限制:

def convertTo[T : JsonReader]: T
def deserialize[X <: T : JsonReader](source:Json): X = {
  source.convertTo[X]
}

def反序列化[X我不确定您使用的是什么库,但是如果您查看
convertTo
类型签名,您将看到需要做什么。例如,spray json有一个
convertTo
方法,如下所示:

def convertTo[T : JsonReader]: T
def deserialize[X <: T : JsonReader](source:Json): X = {
  source.convertTo[X]
}
符号
T:JsonReader
是一个上下文绑定,这是一个语法糖:

def convertTo[T](implicit $ev : JsonReader[T]): T
因此,基本上,您需要接收一个类型参数(如上面的
T
),以及一个基于该类型参数的隐式值,其类型取决于您正在使用的库所需的
convertTo
。假设它是
JsonReader
,那么您的方法就变成:

def deserialize[X : JsonReader](source:Json): X = {
  source.convertTo[X]
}
您需要这样调用,因为无法推断
X

deseralize[A](someSource)
如果需要将
X
作为
T
的子类型,可以添加如下限制:

def convertTo[T : JsonReader]: T
def deserialize[X <: T : JsonReader](source:Json): X = {
  source.convertTo[X]
}

def反序列化[X
def反序列化[T
def反序列化[t]我想你必须看看JSON结构来决定要转换哪个对象。@ AsAydid,这只是我正在尝试做的一个抽象。考虑JSON结构不会改变。这个方法可以同样地产生一种类型或另一种类型。我想你必须看JSON结构来决定要转换哪个对象。这只是我试图做的一个抽象。考虑JSON结构不会改变。这个方法可以同样地产生一个或另一个类型。这不回答我的问题。我已经阐述了我的问题,抱歉是含糊不清的。“DominykasMostauskis,我想是的。但是既然你不这么认为,我就加一个例子。这不能回答我的问题。估计。我已经详细阐述了我的问题,很抱歉含糊不清。@DominykasMostauskis我想是的,但既然你不这么认为,我就添加一个例子。你能简要解释一下
[t Daniel的回答试图解释它。我建议你阅读Scala中的编程。你能简要解释一下
丹尼尔的回答试图解释这一点。我建议阅读Scala编程。