Syn*_*sso 15 string scala implicit ambiguous
我试图创建从任何类型(比如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
Run Code Online (Sandbox Code Playgroud)
隐式转换为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
Run Code Online (Sandbox Code Playgroud)
使用两个隐式转换意味着重复的方法(如长度)是不明确的.
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: ?}
Run Code Online (Sandbox Code Playgroud)
那么,是否有可能隐式转换为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
Run Code Online (Sandbox Code Playgroud)
要么创建一个巨大的代理类,要么将其吸收并要求客户端消除歧义:
100.asInstanceOf[字符串].长度
归档时间: |
|
查看次数: |
4341 次 |
最近记录: |