gpt4 book ai didi

scala - 如何将方法限制为仅用于特定类型?

转载 作者:行者123 更新时间:2023-12-04 22:02:48 28 4
gpt4 key购买 nike

假设我在下面有一个案例类

case class SomeCaseClass[M] private (
value: String
)

在另一个文件中,我具有以下特征和对象。
trait SomeTrait[A] {
def get(oldId: String): A
:
}

object SomeObject {
private[this] def init[A](): SomeTrait[A] = new SomeTrait[A] {
def get(oldId: String): A = id(oldId)
:
}

val aaa: SomeTrait[String] = init[String]()
val bbb: SomeTrait[SomeCaseClass[String]] = init[SomeCaseClass[String]]()
}

我应该如何修改代码,以便将 init 方法限制为仅与 SomeCaseClass[_] 类型一起使用,而不是与上述 String 等任何类型一起使用?

理想情况下,对代码进行一些修改,行 val aaa: SomeTrait[String] = init[String]()应该会导致编译错误。

最佳答案

这就是我想出的:

case class SomeCaseClass[M] private (
value: String
)

trait SomeTrait[A] {
def get(oldId: String): A
}

private[this] def init[A <: SomeCaseClass[_]](): SomeTrait[A] = new SomeTrait[A] {
def get(oldId: String): A = ???
}

val aaa: SomeTrait[String] = init[String]() // Will fail
val bbb: SomeTrait[SomeCaseClass[String]] = init[SomeCaseClass[String]]()

它失败了

ScalaFiddle.scala:16: error: type arguments [String] do not conform to method init's type parameter bounds [A <: ScalaFiddle.this.SomeCaseClass[_$1] forSome { type _$1 }]



您可以查看 scalafiddle .

我不知道这是否是最好的方法 , 但是 init[A <: SomeCaseClass[_]]正在添加绑定(bind)到 A 的类型, 并强制 A成为 SomeCaseClass 的子类.我很想知道是否有更好的方法。

关于scala - 如何将方法限制为仅用于特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55950770/

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