_の正確な意味を知るにはScala言語仕様の6.23 Anonymous Functionの
Placeholder Syntaxを読むのが良いと思う。特に英語圏のブログでScala
やってる人が多用してる気がするけど、正確な意味を解説した記事ってないんだよな。

不正確だけどおおざっぱな説明としては、_を囲む最も内側の式が無名関数化される。
だから、println(_)だと、(x) => println(x)になるけど(_を囲む一番内側の式がprintln(_)
だから)、println(_ + 3)はprintln((x) => x + 3)になる(_を囲む一番内側の式が_ + 3だから)
あと、無名関数化される式はsyntactic category(文法定義上の非終端記号みたいなもの)が
Exprである必要がある。

基本的に、_がどう展開されるかは純粋に構文的に決まり、型とかは一切関係しない。