2015-07-03 103 views
0

我正在寫一個DSL,我有一種情況,我想將某個值隱式轉換爲任何類型。我創建了一個包裝類與價值和主要工作的隱式方法:Scala:我可以訪問類型化方法的類型嗎?

case class ObjectOperationResult(val value: AnyRef) 

object ObjectOperationResult { 
    implicit def result2T[ T ](result: ObjectOperationResult): T = { 
     result.value.asInstanceOf[ T ] 
    } 
} 

如果result.value不是有效的類型的代碼將拋出一個異常;這取決於用戶確保他們做的是正確的事情。但是,我想通過根據目標類型執行不同的邏輯來使其變得更加智能。例如,如果目標類型是String,則調用toString而不是asInstanceOf [];這樣的事情:

case class ObjectOperationResult(val value: AnyRef) 

object ObjectOperationResult { 
    implicit def result2T[ T ](result: ObjectOperationResult): T = { 
     match T { 
      case String s: result.value.toString 
      case _ : result.value.asInstanceOf[ T ] 
     } 
    } 
} 

這不會編譯;有什麼方法可以確定T的類型,以便我可以採取相應的行動?

回答

-1

您可以定義多種功能,如

object ObjectOperationResult { 
    implicit def toString(result: ObjectOperationResult): String = result.value.toString.trim 
    implicit def toInt(result: ObjectOperationResult): Int = result.value.asInstanceOf[Int] 
} 

這種方法比較好,因爲某些原因:
1.代碼編譯只用正確的類型。編譯錯誤總是更好,然後運行時錯誤 2.您可以顯式調用此函數。如果您將從Java調用此代碼,這可能非常重要。

+0

這就是目前我做什麼。問題是它無法處理所有的可能性。例如,用戶可能想要使用他們自己的類。如果可能的話,我想要一個可以處理任何課程的解決方案。 – DeegC

+0

'val str = ObjectOperationResult(「foo」); val i = str'這將編譯爲隱式轉換ObjectOperationResult => Int由ObjectOperationResult.toInt提供,但由於執行了'anyRefValyeOfStr.asInstanceOf [Int]'強制轉換而失敗。編譯時不安全。 – cchantep

-1

做到這一點的一種方法是傳遞類類型作爲參數和條件。

import reflect.runtime.universe._ 

case class ObjectOperationResult(val value: AnyRef) 

object ObjectOperationResult { 
    def result2T[T: TypeTag](c: Class[T], result: ObjectOperationResult): T = { 
     c match { 
      case s if typeOf[T] <:< typeOf[String] => result.value.toString.asInstanceOf[T] 
      case _ => result.value.asInstanceOf[T] 
     } 
    } 
} 

這裏是你如何使用這個:

val a = ObjectOperationResult("hello") 
val b = ObjectOperationResult(new java.util.Date()) 

ObjectOperationResult.result2T(classOf[String], a) 
res0: String = hello 

ObjectOperationResult.result2T(classOf[String], b) 
res1: String = Fri Jul 03 13:15:12 PDT 2015 

ObjectOperationResult.result2T(classOf[java.util.Date], b) 
res2: java.util.Date = Fri Jul 03 13:15:12 PDT 2015 
相關問題