Если я определяю функцию печати, которая принимает только числа, как:
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.
Когда я вызываю print2 с Int:
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 так, чтобы он возвращал функции, а также правильно обращался к неявным?
scalac
. Если подумать, неявные параметры в любом месте, кроме конца, не имеют смысла. Допустим, это разрешеноdef foo(implicit i: Int)(j: Float)(implicit: k: Int)(l: Double) = ...
. Что именно это означает для приложенияfoo(1)(2)(3)
? Это неоднозначно. - person Y.H Wong   schedule 22.02.2011