Скажем, у меня есть пустая маркерная черта с именем Marker
и некоторые функции с параметрами типа, привязанными к Marker
:
trait Marker
object Marker {
def works[M <: Marker](m:M):M = m
def doesntWork[M <: Marker](f:M => String):String = "doesn't matter"
}
Первая функция работает, как я ожидаю. То есть, если вы передаете параметр, который не является Marker
, тогда код не компилируется:
scala> works("a string")
<console>:14: error: inferred type arguments [String] do not conform to method works type parameter bounds [M <: com.joescii.Marker]
works("a string")
^
<console>:14: error: type mismatch;
found : String("a string")
required: M
works("a string")
^
Однако, я могу передать параметр ко второй функции, которая не соответствует Marker
. В частности, я могу передать функцию типа String => String
, и код с радостью компилируется и запускается:
scala> doesntWork( (str:String) => "a string" )
res1: String = doesn't matter
Я ожидаю, что этот вызов doesntWork
не скомпилируется. Может ли кто-нибудь объяснить мне, почему он компилируется и как я могу изменить подпись функции, чтобы предотвратить проверку типов в таких случаях?
Полное раскрытие: вышеупомянутый надуманный пример - упрощенная версия этой выдающейся проблемы для лифта.