Позвольте мне сразу перейти к проблеме, с которой я столкнулся, когда висит вокруг с ограничениями типа.
Рассмотрим следующее ... Я создал функцию 'Foo' как этотПодтипирование ведет к Any: ошибка в компиляторе или проблема с моим кодом?
def foo[A,B](x:A,y:B):(A,B)=(x,y)
Я вызывается Foo в листе лестницу, как
foo("Mars",2400)
я получил результат, как
res0: (String, Int) = (Mars,2400)
Обратите внимание на допустимые типы Марса и 2400
Теперь я хотел обеспечить, чтобы функция «foo» принимала целые числа или плавающие или двойные (любой тип, который является подтипом 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)
Теперь, желаемый способ enfor cing здесь не работал. Если бы я сделал что-то вроде этого
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 вместо этого выводится тип Любой и пусть мой код проходит проверку типа?
Должен ли я всегда применять второй тип, чтобы быть подтипом AnyVal вместо того, чтобы дать компилятору сделать его для меня? или это ошибка в компиляторе.
Ищите помилование, если вы обнаружили, что мой вопрос вводит в заблуждение или не соответствует вашим ожиданиям.
В настоящее время я использую SCALA-библиотеку 2.11.8
Thankyou
Это замечательно. Просто увеличил мои знания о типах вывода и ограничениях типа. – Samar
это именно то, что я хотел ... идеальное решение –