2016-12-11 91 views
0

對於典型的類,你可以創建一個隱含的類添加新的方法到其他類的實例,就像這樣:通過implicits到同伴對象添加方法

implicit class IntWrapper(i: Int) { 
    def otherMethod(s: String) = println(s"i: ${i} with ${s}") 
    } 

現在你可以做

3.otherMethod("something") 

我的問題是

  1. 是有可能的方法對添加到Intcompanion object(應答here

  2. 想象一下,您的項目中定義了一個Java enum,並且您正在Scala代碼中使用它。 Java enums.valueOf(s: String)方法從String獲取枚舉值,但是會拋出IllegalArgumentException。我想添加一個方法.safeValueOf(s: String),將返回Option

    是否可以像我們在第一個示例中那樣添加該方法到Java enum

+0

我不認爲這是可能的。 Java枚舉本身不是一個值。所以它不能被轉換。 –

回答

1

這裏是你可以 2(近似,未經測試)做:

import scala.reflect.ClassTag 
import scala.util.Try 

object SafeValueOf { 
    def apply[E <: Enum[E]](s: String)(implicit tag: ClassTag[E]): Option[E] = 
    Try(Enum.valueOf(tag.runtimeClass.asInstanceOf[Class[E]], s)).toOption 
} 

用法:SafeValueOf[MyEnum]("something")