質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.98%

  • Kotlin

    175questions

    Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

数値リテラルと型変換?について

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 386

mosa

score 198

いつもありがとうございます。
Kotlin の数値リテラルと型変換?についての質問です。

ソースコード

val a = 3 // OK. 型推論されInt型の数値みなされる。
val l:Long = 3 // OK.  Long型の3とみなしてくれる。 3L でもよい。
val i:Int = 3 // OK.
val s:Short = 3 // OK Short型の3とみなしてくれる。 Short型の数値リテラルがない。
val b:Byte = 3 // OK. Byte型の3とみなしてくれる。 Byte型の数値リテラルがない。
val d:Double = 3 // NG. Double型の3.0とはみなしてくれない。 3.0 としなければならない。
val f:Float = 3.0 // NG. Float型の3.0とはみなしてくれない。 3.0f or 3.0F としなければならない。

val l1:Long = 3l // NG.
val l2:Long = 3L // OK.
val f1:Float = 3.0f // OK.
val f2:Float = 3.0F // OK.

質問

質問1.
Long・Floatの数値リテラル指定方法はあるのに、Short・Byte・Doubleにないのはなぜ?
→Long, Short, Byte, Double, Float 全てに数値リテラル指定があったほうが統一感があると思います。(2L, 2S, 2B, 3.0D, 2.0F のように)

質問2.
Long・Short・Byteはリテラル代入時に自動的に型変換をしてくれるのにDouble・Floatではしてくれないのはなぜ?
→整数値と浮動小数値の違いはわかりますが、変数の型に応じて自動的に型変換するという意味では機械的に 3 を Double の 3.0 とみなしたほうが統一感があるのではないかと思います。
→少なくともFloat型に関してはShort・Byteに合わせて3.0でも可としないと統一感がない気がします。

質問3.
Float は 3.0f 3.0F と両方の表記が許されるのに、Long は 3lという表記が許されないのはなぜ?
→小文字の「エル」が数字の「いち」と見分けづらいから?


合理的な理由があってのものだと思うのですが、なんだか統一感が無い気がして質問させていただきました。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

質問2については
https://kotlinlang.org/docs/reference/basic-types.html
公式ドキュメントには、数値についてはByteからIntのような小さい型から大きい型への暗黙的な変換は行われない、と書かれています。
数値リテラルについては大きい型から小さい型への暗黙的な変換が許されているのでしょう。
一度変数に入れた場合は型にしばられるため異なる型には暗黙的に変換されません。
DoubleとFloatはそれぞれリテラルが用意されているので明示的に書きなさいという言語設計なのでしょう。

質問1に関連して数値リテラルを細かく分ける統一性よりも、記述の簡潔さを優先したのだと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 16:06 編集

    「there are no implicit widening conversions for numbers」は私も見つけたのですが、var l: Long = 3 はエラーにならないんですよね。(ドキュメントが更新されていないのでしょうか?)

    キャンセル

  • 2017/09/26 16:19

    確かにそれはドキュメントと合っていませんね。

    キャンセル

  • 2017/09/26 17:01

    言語仕様を見てもTODOだらけで、細かい所はドキュメントに出ていませんね。
    http://jetbrains.github.io/kotlin-spec/#_decimal_literals
    decimal literalはInt型であるけれども「TODO: it is more complicated」のため一見矛盾することが通ってしまうようです。

    キャンセル

  • 2017/09/26 17:33

    「6.10. Conversions」とか丸々TODOになってますねw

    一つ関係のありそうなissueを見つけました。
    https://youtrack.jetbrains.com/issue/KT-3936

    キャンセル

  • 2017/09/26 17:34

    ご回答ありがとうございます。
    「小さい型から大きい型への暗黙的な変換は行わない」という記載しかないのですが、実際の挙動も合わせてみると、逆に「decimal literalにおいて、大きい型から小さい型への暗黙的な変換は行う」ととらえてよい感じですかね。
    加えて、なぜか「Int型であるはずのdecimal literalはLong型への暗黙的な変換は行う」ということになりますかね。

    キャンセル

  • 2017/09/26 17:49

    fuzzballさん 
    コメントありがとうございます。
    なんだかもうついていけなくなってきました。。。
    val l: Long = 0
    println(l.equals(0)) // コンパイル通る(false)
    println(l == 0) // コンパイル通らない

    キャンセル

  • 2017/09/26 18:12

    まとめるとその通りです。
    いまいち整合性が取れてないですが、decimal literalは代入時には暗黙的に変換されるのでしょう。

    キャンセル

  • 2017/09/28 10:32

    ありがとうございます。いったんクローズしますが、引き続き何か情報がありましたらコメントなどいただけると幸いです。
    Kotlinのissueなども少しずつ見ていけるようにしたいと思います。
    ありがとうございました。

    キャンセル

0

 回答2

Kotlinは暗黙の型変換を行いません。
val s: Short = 3の3をShortと見做すのは型推論であって型変換ではありません。

他は分からないです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/26 14:35

    ご回答ありがとうございます。
    すみません。私の「型推論」と「暗黙の型変換」の理解がそもそも誤っているのかもしれません。
    1.「val s:Short」は型を明記しているので、sは「型推論」されるわけではないと思っています。
    2.「3 is Int」が「true」となり、「3 is Short」が「Incompatible types」となるところを見ると、リテラル「3」はInt型であり、Short型であるsにInt型の3を代入できているので、「暗黙の型変換」に見えてしまいます。

    キャンセル

  • 2017/09/26 15:06 編集

    すみません、回答は私の勘違いですね。マイナス付けておいて下さいw
    ただ、暗黙の型変換ではなく、Int から Shortへの明示的な型変換だと思います。

    【追記】あ、明示的だと 3.toShort() になるんですかね‥。

    キャンセル

  • 2017/09/26 17:22

    ああ、なるほどです。「3.toShort() is Short」は「true」になりました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Kotlin

    175questions

    Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。