gpt4 book ai didi

Scala:根据参数返回不同的类型 - 无需强制转换

转载 作者:行者123 更新时间:2023-12-02 09:33:58 25 4
gpt4 key购买 nike

我正在尝试编写一个函数,它可以根据传入的参数返回不同的类型。使用一个非常简单的示例,这是我要达到的理想情况:给定这些对象:

case object NameToken
case object SalaryToken
case object IsDirectorToken

val john: Employee

然后:

  • john.get(NameToken) 将返回“John”(一个字符串),
  • john.get(SalaryToken) 将返回 50000(一个 Int),
  • john.get(IsDirectorToken) 将返回 false( bool 值)。

下面是我想到的几个可能的实现。不用说,两者都很可怕。

可能的实现方式一:

trait Token[A]
case object NameToken extends Token[String]
case object SalaryToken extends Token[Int]
case object IsDirectorToken extends Token[Boolean]

case class Employee(name: String, salary: Int, isDirector: Boolean) {
def get[A](t: Token[A]): A = t match {
case NameToken => name.asInstanceOf[A]
case SalaryToken => salary.asInstanceOf[A]
case IsDirectorToken => isDirector.asInstanceOf[A]
}
}

可能的实现方式二:

trait Token2 {
type returnType
}
case object NameToken2 extends Token2 {
type returnType = String
}
case object SalaryToken2 extends Token2 {
type returnType = Int
}
case object IsDirectorToken2 extends Token2 {
type returnType = Boolean
}

case class Employee2(name: String, salary: Int, isDirector: Boolean) {
def get(t: Token2): t.returnType = t match {
case NameToken2 => name.asInstanceOf[t.returnType]
case SalaryToken2 => salary.asInstanceOf[t.returnType]
case IsDirectorToken2 => isDirector.asInstanceOf[t.returnType]
}
}

然而,他们俩的选角都很糟糕。

我可以更巧妙地解决这个问题吗?

谢谢。

最佳答案

class Employee(val name: String, val salary: Int, val isDirector: Boolean) {
def get[T](t: Token[T]): T = t.value(this)
}

trait Token[T] { def value(e: Employee): T }
object NameToken extends Token[String] { def value(e: Employee) = e.name }
object SalaryToken extends Token[Int] { def value(e: Employee) = e.salary }
object IsDirectorToken extends Token[Boolean] { def value(e: Employee) = e.isDirector }

用法

scala> val john = new Employee("John", 50000, false)
john: Employee = Employee@59f99ea

scala> val name = john.get(NameToken)
name: String = John

scala> val salary = john.get(SalaryToken)
salary: Int = 50000

scala> val isDirector = john.get(IsDirectorToken)
isDirector: Boolean = false

关于Scala:根据参数返回不同的类型 - 无需强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29330609/

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