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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Kotlin

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

Q&A

解決済

1回答

2001閲覧

型はIntのはずなのに比較する際にString.compareToがよばれている?

Imajo

総合スコア8

Kotlin

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

0グッド

1クリップ

投稿2020/04/29 10:56

fun main() { // Map変数 itemsを定義 val items: Map<String, Any> = mutableMapOf( "name" to "kato", "age" to 10 ) //Integer型である事を確認 println(items["age"] is Integer) //=> true //1 println()メソッドの実行 println(items["age"]) //=> 10   //2 比較演算子 == println(items["age"] == 10) //=> true //3 比較演算子 < println(items["age"] < 9) // => エラー }

現在kotlinに入門中なのですが上記の様にMap変数のitemsに対して["age"]keyでvalueを取得し、1,2,3の処理を行なう際に
3の比較演算子 < を使用すると下記の様にエラーが表示されてしまいます。

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: public fun String.compareTo(other: String, ignoreCase: Boolean = ...): Int defined in kotlin.text

String.compareToメソッドが呼び出されているが比較対象がIntのためコンパイルできないと言われていると思うのですが、items["age"]で取得できるvalueはInt型のためなぜString.compareTo()が実行されているのか理解できていません。
自分がもともとPHPをメインに使用していたためJavaやkotolinの仕様がよくわかっていないのですがどなたか解説と解決策を教えていただけないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

items["age"]の型はなんでしょうか?
val items: Map<String, Any>とあなたが定義しているので、Any型です。
大小比較ができるためには、compareTo()メソッドが定義されている必要がある(一般的にははComparableインタフェースを実装かな)。Any型にcompareTo()メソッドが定義されていないのでコンパイルエラーとなる。Comparison operators

だから、キャストするかなにか対応する必要がある。

kotlin

1 //3 比較演算子 < 2 println(items["age"] < 9) // => エラー 3 println((items["age"] as Comparable<Int>) < 9) 4 println((items["age"] as Int) < 9)

Javaで書けばわかりますかね。

import org.junit.Test; import java.util.HashMap; import java.util.Map; public class xxHogeJava { @Test public void xxx() { // Map変数 itemsを定義 final Map<String, Object> items = new HashMap() { { put("name", "kato"); put("age", 10); } }; //Integer型である事を確認 System.out.println(items.get("age") instanceof Integer);//=> true //1 System.out.println()メソッドの実行 System.out.println(items.get("age")); //=> 10 //2 比較演算子 == System.out.println(items.get("age").equals(10)); //=> true //3 比較演算子 < // System.out.println(items.get("age").compareTo(9) < 0); // => エラー System.out.println(((Comparable) items.get("age")).compareTo(9) < 0); System.out.println(((Integer) items.get("age")).compareTo(9) < 0); } }

投稿2020/04/29 12:15

編集2020/04/29 12:26
shiketa

総合スコア4061

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

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

Imajo

2020/04/30 03:22

ありがとうございます。Any型について理解できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問