2014-06-15 65 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類。 –