我经常希望通过使用类型别名来避免在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)。
我是否以错误的方式完成了这一切,并且类型别名不能像这样使用?
答案 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
}
}