当前位置:  开发笔记 > 编程语言 > 正文

避免Scala中的隐式def歧义

如何解决《避免Scala中的隐式def歧义》经验,为你挑选了2个好方法。

我试图创建从任何类型(比如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方法?



1> Richard Dall..:

我没有解决方案,但会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



2> huitseeker..:

从Scala 2.8开始,这已经得到了改进.根据本文(§ 避免歧义):

以前,仅根据方法的参数类型选择最具体的重载方法或隐式转换.还有一个附加条款规定,最具体的方法不能在任何其他替代方案的适当超类中定义.这个方案已经在Scala 2.8中由以下更自由的方式替换:当比较重载方法或隐式方法的两个不同的适用替代方案时,每个方法获得一个点以获得更具体的参数,另一个点被定义为一个适当的子类.如果在这两个比较中得到更多的分数,则另一个"胜利"胜过另一个.这尤其意味着如果替代品具有相同的参数类型,则在子类中定义的参数类型获胜.

有关示例,请参阅其他文章(第6.5节).

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有