内置支持字符串 - >特征?

时间:2015-02-28 17:18:30

标签: scala traits

鉴于以下内容:

scala> trait Foo
defined trait Foo

scala> case object Bip extends Foo
defined module Bip

scala> case object Bar extends Foo
defined module Bar

Scala内置的任何功能是否可以从Foo生成String

示例:

f("Bip") === Bip

f("Bar") === Bar

f("...") ===异常(或者可能会返回None)?

1 个答案:

答案 0 :(得分:2)

您可以使用宏,但使用简单的Java反射可能更容易:

namespace org.example

import scala.util.control.Exception._

object Demo extends App {
  sealed trait Foo
  case class Bar() extends Foo
  case class Bip() extends Foo

  def makeFoo(s: String): Option[Foo] = {
    catching(classOf[Exception]).opt(Class.forName("org.example.Demo$" + s).newInstance.asInstanceOf[Foo])
  }

  println(makeFoo("Bar")) // Some(Bar())
  println(makeFoo("Bip")) // Some(Bip())
  println(makeFoo("Bop")) // None
}

如果将所有案例类放在一个像上面那样的对象容器中,那么类名应该是可预测的。

编辑:为特殊情况添加了可选包装。