Позвольте мне сразу перейти к проблеме, с которой я столкнулся, пока возился с ограничениями типов.
Давайте рассмотрим следующее... Я создал функцию 'foo', подобную этой
def foo[A,B](x:A,y:B):(A,B)=(x,y)
Я вызвал foo на листе scala, например
foo("Mars",2400)
Я получил результат, как
res0: (String, Int) = (Mars,2400)
Обратите внимание на выведенные типы Mars и 2400
Теперь я хотел обеспечить, чтобы функция 'foo' принимала целые числа, числа с плавающей запятой или числа Double (любой тип, являющийся подтипом AnyVal).
Для обеспечения соблюдения я написал код вроде
def fooNew[A<:B,B](x:A,y:B):(A,B)=(x,y)
Типы, выведенные из предыдущего кода, были (String, Int), и когда я вызывал fooNew, например
fooNew("Saturn",2400)
Я был удивлен, увидев, что компилятор пропустил мой код и не вызвал ошибку, вместо этого он выдал результат, подобный
res0: (String, Any) = (Saturn,2400)
Желаемый способ принуждения здесь не сработал. Если бы я сделал что-то вроде этого
def fooNew[A<:B,B<:AnyVal](x:A,y:B):(A,B)=(x,y)
Компилятор наверняка выдал бы мне ошибку, и это произошло!
Error:(2, 2) inferred type arguments [String,Any] do not conform to method fooNew's type parameter bounds [A <: B,B <: AnyVal]
fooNew("Saturn",2400);}
Я хочу спросить, почему компилятор не выбрал тип Int, а вывел тип Any и позволил моему коду пройти проверку типов?
Всегда ли мне нужно принудительно принуждать второй тип быть подтипом AnyVal вместо того, чтобы позволять компилятору делать вывод за меня? или это ошибка в компиляторе.
Прошу прощения, если мой вопрос вводит в заблуждение или не соответствует вашим ожиданиям.
В настоящее время я использую scala-library 2.11.8
Спасибо.