Nie będąc Martin Odersky , Mogę tylko zgadywać :-) Patrząc na Scaladoc z foreach
, widzę to:
/** Applies a function `f` to all elements of this $coll.
*
* @param f the function that is applied for its side-effect to every element.
* The result of function `f` is discarded.
*
* @tparam U the type parameter describing the result of function `f`.
* This result will always be ignored. Typically `U` is `Unit`,
* but this is not necessary.
*
* @usecase def foreach(f: A => Unit): Unit
*/
Tak więc typ zwrotu f
nie ma znaczenia, a jego wynik jest zawsze odrzucany. To, według mnie, sugeruje, że użycie ogólnego rodzaju parametru tutaj w celu oznaczenia typu zwrotu jest jedynie subtelnością dokumentacji, mówiąc, że "typem zwrotu może być wszystko, naprawdę wszystko, co lubisz". Zważywszy, że typ zwrotny Any
może sugerować (niektórym) czytelnikom pewnego rodzaju ograniczenie do typów funkcji mających zastosowanie tutaj.
Innym aspektem jest to, że Scala została bardzo świadomie zaprojektowana jako ogólna od podstaw. Tak więc - dla mnie - użycie ogólnego parametru typu jest zgodne z ogólną filozofią tego języka, przy jednoczesnym użyciu Any
- choć technicznie użyteczne - byłoby zdecydowanie nietypowym podejściem, które byłoby sprzeczne z resztą języka.
Nie mam czasu, aby wymyślić przykład, ale mocno podejrzewam, że pozwala inferencer typu ignorować 'foreach', jeśli chodzi o wnioskowanie typu zwrotu funkcji. Ale nie znam przypadku poza moją głową, gdzie by to miało znaczenie (tzn. Że "Any" nie dałoby takiego samego wniosku). –