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

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

新規登録して質問してみよう
ただいま回答率
85.48%
IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Kotlin

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

Q&A

解決済

1回答

1003閲覧

Kotlinのwhen文でis Stringによる判定で条件分岐したい。

shal0ne

総合スコア51

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Kotlin

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

0グッド

0クリップ

投稿2018/08/02 17:43

前提・実現したいこと

Kotlinのwhen文でis Stringによる判定で条件分岐したい。

発生している問題・エラーメッセージ

Kotlinスタートブックという本でKotlinを学習しています。
その中でKotlinのwhen文は、Javaのswitch文のように特定の数値だけでなく、様々な条件文を選択肢に取れると書かれていました。
その例としてis Stringによる判定が含まれていたので、早速コードを写経してみたのですがエラー//errormessage1が出てしまいます。
これではis Stringによる条件分岐ができないのですが、どのようにしたら上手くいくか、また上手くいかない要因は何かを知りたいです。

Incompatible types: String and Int //errormessage1 'when' with subject should be used more... //errormessage2

該当のソースコード

Kotlin

1fun p2(){ 2 val y=17 //error 3 val blank=when(y){ 4 is String->y.isBlank() 5 else->true 6 } 7 println(blank) 8 9 var z:Int=88 10 val grade=when{ 11 z>=90->'A' 12 z>=80->'B' 13 z>=70->'C' 14 z>=60->'D' 15 else->'F' 16 } 17 println(grade) 18}

試したこと

//errorのy=17を、y="abc"にしてみた所成功。
最初は、when(y)のカッコ内のパラメータy(Int)と、条件文is String(Boolean)を比較しているからエラーが出ているのだと思ったのですが、試しにString型の"abc"に変えて見た所通ってしまいました。
そもそもこの推測はerrormessage1に沿ってはいないのですが。

//when(y){is String〜}を、when{y is String->〜}としてみた所失敗
下でwhen{z>=〜}としていたのでこれで通るのではと思いましたが、今度は//errormessage2が表示され、通りませんでした。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

whenは全く関係なくて、これで同じエラーが出ます。

kotlin

1val y = 17 2println(y is String) 3//=> error: incompatible types: String and Int

おそらくですが、Intは絶対にStringにならないからエラーになっているんだと思います。(warningでいいような気もするのですが‥)

kotlin

1val y: Any = 17

にすれば正しく実行されます。

投稿2018/08/03 00:31

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shal0ne

2018/08/03 05:50

解決しました。 そもそもStringとかの親クラス(Any)で中身を隠してからでないと、isが使えないのですかね。 あくまでキャストができるかどうかの判定だから、最初からこういうのは例外みたいな感じなのかなんなのか。 でも、いずれにせよなり得ないのであればfalseで通してくれても良さそうなのですが、、、 ありがとうございました。
fuzzball

2018/08/03 06:29

>>中身を隠してからでないと、isが使えないのですかね "hoge" is Stringはエラーにならない(trueが返る)ので、使えないわけではないですね。 >>falseで通してくれても良さそうなのですが 意味のないコードというのはミスの可能性がありますので、エラーなりワーニングなりは出すべきだと思います。
shal0ne

2018/08/04 16:18

返信がきちんと送れていませんでした。 自身で確認したのを忘れていましたが、そうでしたね。 その方が仕様としては適切なのですね。 十分に理解はできていませんが、そう思い至れるよう精進します。 回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問