作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力解决 Scala 隐式转换问题。以下代码片段说明了我的问题:
import org.junit.{ Test, Before, After };
class ImplicitsTest {
implicit def toStringWrapper(str: String) = new StringWrapper(str);
@Test
def test(){
val res1: Predicate = "str" startsWith "other";
}
}
class StringWrapper(str: String){
def startsWith(other: String): Predicate = null;
}
trait Predicate
最佳答案
值得庆幸的是,Scala 不会让您在没有注意到的情况下偷偷带入替换方法——如果您在类上调用一个方法,并且该类具有该方法,那么这就是您获得的方法调用。否则可能会引起各种困惑。
这让您有另外两个选择:
(1)重命名方法
(2) 添加特定的方法来进行转换。
第二种方法的工作原理如下:您定义一个类,该类具有您想要的方法和返回自身的唯一命名的方法,如果您希望能够使用自定义像原始字符串一样的项目(好像它扩展了字符串):
object ImplicitExample {
class CustomString(s: String) {
def original = s
def custom = this
def startsWith(other: String): Int = if (s.startsWith(other)) 1 else 0
}
implicit def string_to_custom(s: String) = new CustomString(s)
implicit def custom_to_string(c: CustomString) = c.original
def test = {
println("This".custom.startsWith("Thi"))
println("This".custom.length())
}
}
scala> ImplicitExample.test
1
4
scala>
关于Scala隐式转换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3876043/
我是一名优秀的程序员,十分优秀!