Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

Unit値がコンパイラによって挿入される

More than 3 years have passed since last update.

コンパイルエラーにならなかった

あら、通るの。

def foo(): Future[Unit] = Future.successful(100)

型階層の確認

http://www.scala-lang.org/api/2.12.1/scala/concurrent/Future.html

Future型は Future[+T] で型パラメータは共変指定。
上記のコードがコンパイルが通るということはInt型はUnit型のサブクラスじゃないといけないわけだが

scala> 100.isInstanceOf[Unit]
res0: Boolean = false

ふむ。

なお、Unit型はAnyValを継承してfinalが付けられている。

http://www.scala-lang.org/api/2.12.1/scala/Unit.html

コンパイルの様子を見る

❯❯❯❯ scala -Xprint:typer -e 'def foo(): scala.concurrent.Future[Unit] = scala.concurrent.Future.successful(100)'                                                                                                       

出力内容を抜粋して、

....

private def foo(): scala.concurrent.Future[Unit] = scala.concurrent.Future.successful[Unit]({
  100;
  ()
})

....

なるほどー。
そういうわけかー。

その他にも、

val x: Unit = "hello, world!"

これもコンパイルは通る。もう予想はつくが -Xprintして 抜粋して、、、

....

private[this] val x: Unit = {
  "hello, world!";
  ()
};

....
mtoyoshi
調査モノのアウトプットが中心です
fringe81
Fringeは、最新のテクノロジーとプロフェッショナルによるサービスにより、社会課題に仮説を立てて市場に広げていくことで、数十年という長期的なスパンで価値を生み出し続け、より良い世界を創る集団です。 既存の領域に限らず、時流を読み、仮説を生み出し、テクノロジーの力で優れたサービスを生み出し続けます。
https://www.fringe81.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away