如果我定义一个只接受数字的打印函数,例如:
我可以使用以下方式调用上述内容:
请注意隐式参数是第一个参数而不是最后一个参数。
如果我尝试手动定义上述函数:
基本上,上述内容不是一个有效的函数定义,但当我先前定义了print2时,编译器会创建它。
当我使用一个Int调用print2时:
def print[T <% Number](value:T) {}
print: [T](value: T)(implicit evidence$1: (T) => java.lang.Number)Unit
我可以使用以下方式调用上述内容:
我可以这样调用:
print(5)
print(5.5)
print(6L)
但不能使用字符串:
print("aaa")
<console>:7: error: could not find implicit value for evidence parameter of type (java.lang.String) => java.lang.Number
print("aaa")
这是预期的结果。
但是如果我将打印函数定义为:
def print2[T <% Number]: T => Unit = value => { }
print2: [T](implicit evidence$1: (T) => java.lang.Number)(T) => Unit
请注意隐式参数是第一个参数而不是最后一个参数。
如果我尝试手动定义上述函数:
def print3[T](implicit f: (T) => java.lang.Number)(value:T):Unit = { }
<console>:1: error: '=' expected but '(' found.
def print3[T](implicit f: (T) => java.lang.Number)(value:T):Unit = { }
基本上,上述内容不是一个有效的函数定义,但当我先前定义了print2时,编译器会创建它。
当我使用一个Int调用print2时:
print2(5)
<console>:7: error: type mismatch;
found : Int(5)
required: (?) => java.lang.Number
print2(5)
如果我将其参数化:
print2[Int](5)
<console>:7: error: type mismatch;
found : Int(5)
required: (Int) => java.lang.Number
print2[Int](5)
看起来它找不到从scala.Int => java.lang.Integer的隐式转换。
我该如何重新定义print,使其返回函数并以正确的方式访问隐式转换?
def foo(implicit i: Int)(j: Float)(implicit: k: Int)(l: Double) = ...
,那么对于应用程序foo(1)(2)(3)
到底意味着什么?这是不明确的。 - Y.H Wong