Scala:使用object键入别名

时间:2014-06-15 17:36:27

标签: scala

我经常希望通过使用类型别名来避免在scala中创建新类。但我还需要一些静态方法来处理这些类型。 请考虑以下CardValue类型示例:

package object cards {
  /**
   * Type representing card values from 2 to A
   */
  type CardValue = Byte
}

object CardValue {
  /**
   * Creates CardValue
   *
   * @param value value index from 0 (2) o 12(A)
   * @tparam T any Numeric type which can be converted to Byte
   * @return new CardValue
   */
  def apply[T <% Byte](value: T): Card = {
    require(value >= 0 && value < 13, "Wrong card value index. CardValue is enumeration from 0 to 12.")
    value
  }

  /**
   *
   * @return Correct string for card value
   */
  override def toString: String = {
    case 8 => "T"
    case 9 => "J"
    case 10 => "Q"
    case 11 => "K"
    case 12 => "A"
    case x: Number => (x.byteValue() + 2).toString
  }
}

此代码目前存在两个问题: 1.它没有编译 2.我不确定代码是否按照我的计划运行(例如,它将从对象而不是Byte调用toString)。

我是否以错误的方式完成了这一切,并且类型别名不能像这样使用?

1 个答案:

答案 0 :(得分:2)

这不是真正的别名类型。声明type CardValue = Byte时,CardValue不应为实际类型。使用该语法,CardValue字面上将是Byte类型,除了名称,因此您将无法覆盖它的方法或任何东西 - 除非您将其扩展到另一个类。

此代码的另一个问题是toString方法应该在类中,而不是对象。 object CardValue应该是case class CardValue(value: Byte)的伴随对象,您可以在那里定义toString

case class CardValue(value: Byte) {

    require(value >= 0 && value < 13, "Wrong card value index. CardValue is enumeration from 0 to 12.")

    override def toString: String = this.value match {
        case 8 => "T"
        case 9 => "J"
        case 10 => "Q"
        case 11 => "K"
        case 12 => "A"
        case x: Number => (x.byteValue() + 2).toString
    }

}