我试图创建任何类型为String的隐式转换(比如,智力)避免隐DEF歧义......在斯卡拉
的隐式转换为字符串表示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意味着字符串方法(如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和RichString方法?
看起来'吮吸'是最好的选择。 Scala中的API设计比成为API消费者要困难得多。 我想创建一个包装值的数据类型,并允许API用户将数据类型当作是实际值的类型。例如。如果它包装一个Int,然后像int一样处理对象。原来这太难了。 我在考虑给我的数据类型的辅助方法: T型 VAL internedValue:T 高清S = internedValue.asInstanceOf [字符串] 高清I = internedValue.asInstanceOf [INT] ...等 – Synesso 2009-08-27 23:38:51
身高'( 100:String).length',因为这是类型安全的,而'asInstanceOf'不是。此外,它更漂亮,更短。 – 2009-12-11 11:04:18
不仅如此,而且asInstanceOf在这里永远不会工作,因为它只会向下转换(这在这里肯定会失败),并且不会启动任何隐式转换。换句话说,'100.asInstanceOf [String] .length'将总是失败,出现'ClassCastException' – 2015-05-06 08:01:37