我试图创建从任何类型(比如Int)到String的隐式转换...
隐式转换为String意味着RichString方法(如反向)不可用.
implicit def intToString(i: Int) = String.valueOf(i) 100.toCharArray // => Array[Char] = Array(1, 0, 0) 100.reverse // => error: value reverse is not a member of Int 100.length // => 3
隐式转换为RichString意味着String方法(如toCharArray)不可用
implicit def intToRichString(i: Int) = new RichString(String.valueOf(i)) 100.reverse // => "001" 100.toCharArray // => error: value toCharArray is not a member of Int 100.length // => 3
使用两个隐式转换意味着重复的方法(如长度)是不明确的.
implicit def intToString(i: Int) = String.valueOf(i) implicit def intToRichString(i: Int) = new RichString(String.valueOf(i)) 100.toCharArray // => Array[Char] = Array(1, 0, 0) 100.reverse // => "001" 100.length // => both method intToString in object $iw of type // (Int)java.lang.String and method intToRichString in object // $iw of type (Int)scala.runtime.RichString are possible // conversion functions from Int to ?{val length: ?}
那么,是否有可能隐式转换为String并仍然支持所有String和RichString方法?
我没有解决方案,但会RichString
在您intToString
隐含之后评论原因方法不可用Scala不链接隐式调用(请参阅Scala编程中的 21.2"隐含规则" ).
如果你引入了一个中间体String
,Scala会将RichString
隐含的转换作为一个(隐含的定义Predef.scala
).
例如,
$ scala Welcome to Scala version 2.7.5.final [...]. Type in expressions to have them evaluated. Type :help for more information. scala> implicit def intToString(i: Int) = String.valueOf(i) intToString: (Int)java.lang.String scala> val i = 100 i: Int = 100 scala> val s: String = i s: String = 100 scala> s.reverse res1: scala.runtime.RichString = 001
从Scala 2.8开始,这已经得到了改进.根据本文(§ 避免歧义):
以前,仅根据方法的参数类型选择最具体的重载方法或隐式转换.还有一个附加条款规定,最具体的方法不能在任何其他替代方案的适当超类中定义.这个方案已经在Scala 2.8中由以下更自由的方式替换:当比较重载方法或隐式方法的两个不同的适用替代方案时,每个方法获得一个点以获得更具体的参数,另一个点被定义为一个适当的子类.如果在这两个比较中得到更多的分数,则另一个"胜利"胜过另一个.这尤其意味着如果替代品具有相同的参数类型,则在子类中定义的参数类型获胜.
有关示例,请参阅其他文章(第6.5节).