gpt4 book ai didi

Scala - 返回与作为参数传递的类型相同的类型

转载 作者:行者123 更新时间:2023-12-04 00:50:03 26 4
gpt4 key购买 nike

假设我有一个 M 类,A、B、C 类继承了它:

abstract M
A extends M
B extends M
C extends M

我想做这样的事情:

val a0:A = ...
val b0:B = ...
val c0:C = ...
val a1:A = transform[A](a0)
val b1:B = transform[B](b0)
val c1:C = transform[C](c0)

哪里transform本质上对每个子类型执行相同的操作,只是结果对象的构造方式有所不同。

我有一种预感,这是不可能的,我需要复制代码并创建单独的转换方法或诉诸类型转换。或者有更好的办法吗?

编辑

请注意def transform[T<:M](t:T):T不起作用。如果我们尝试返回 A、B 或 C,我们将收到以下错误消息。

Expression of type A does not conform to expected type T

Expression of type B does not conform to expected type T

Expression of type C does not conform to expected type T

编辑2也许有关我正在尝试做的事情的一些更详细的信息:

transform(m:M) = {
val P = Property P computed from m
m match {
case a:A => construct and return new A from a with property P
case b:B => construct and return new B from b with property P
case c:C => construct and return new C from c with property P
case _ => error
}
}

如果我这样做,那么我需要强制转换:

val a1:A = transform(a0).asInstanceOf[A]
val b1:B = transform(b0).asInstanceOf[B]
val c1:C = transform(c0).asInstanceOf[C]

我想消除它。

最佳答案

这很简单:

class M
class A extends M
class B extends M

def transform[T <: M](obj: T): T = {
obj
}

val a0:A = new A
val a1:A = transform(a0)
val b0:B = new B
val b1:B = transform(b0)

关于Scala - 返回与作为参数传递的类型相同的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31100566/

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