2014-06-15 25 views
0

我经常想通过使用类型别名避免在scala中创建新的类。但我也需要一些静态方法来处理这些类型。 考虑下面的例子为CardValue类型:Scala:输入对象的别名

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.我不知道该代码将作为我的计划(例如它将从对象调用toString而不是来自Byte)。

我是不是这样做了所有错误的方法,并输入别名不能像这样使用?

回答

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 
    } 

} 
+0

这有用,谢谢,它回答了我所有的问题。另外,您需要删除对象实现。案例类带有默认应用方法 – GrayR

+0

您是对的。我会把你的'require'移到它所属的case类。 –