incompatible types の原因と直し方
型が合わない代入で出ます。String / int / char / double の相互変換ルールを整理します。
エラーメッセージの読み方
Main.java:3: error: incompatible types: String cannot be converted to int
Main.java- ファイル名
3- 行番号 — javacが異常に気づいた位置。原因の行とは限りません
error- 種別 — コンパイルエラー。実行まで到達しません
incompatible types: String cannot be converted to int- 内容 — javacが期待していたもの、または見つけられなかったもの
このエラーが出る典型パターン
パターン1
1 public class Main { 2 public static void main(String[] args) { 3 int name = "Taiyo"; ^ 4 System.out.println(name); 5 } 6 }
Main.java:3: error: incompatible types: String cannot be converted to int
ダブルクォートで囲んだ値はString型です。charは 'a' のようにシングルクォート1文字だけを扱います。
直し方: int を String にします。
広告
広告スロット(未設定)
パターン2
1 public class Main { 2 public static void main(String[] args) { 3 int age = "20"; ^ 4 System.out.println(age); 5 } 6 }
Main.java:3: error: incompatible types: String cannot be converted to int
"20" は文字列で、数値の20とは別物です。文字列を数値にするには Integer.parseInt() が要ります。
直し方: "20" を 20 にします。
パターン3
1 public class Main { 2 public static void main(String[] args) { 3 int price = 9.8 ; ^ 4 System.out.println(price); 5 } 6 }
Main.java:3: error: incompatible types: possible lossy conversion from double to int
小数リテラルはdouble型です。intに入れると情報が失われるため、明示的なキャストを要求されます。
直し方: 9.8 を (int) 9.8 にします。
パターン4
1 public class Main { 2 public static void main(String[] args) { 3 boolean isReady = 1 ; ^ 4 System.out.println(isReady); 5 } 6 }
Main.java:3: error: incompatible types: int cannot be converted to boolean
Javaのbooleanは0/1と互換性がありません。真偽値は必ずtrue/falseで表します。
直し方: 1 を true にします。
パターン5
1 public class Main { 2 static void printDouble(int n) { 3 System.out.println(n * 2); 4 } 5 public static void main(String[] args) { 6 printDouble("5"); ^ 7 } 8 }
Main.java:6: error: incompatible types: String cannot be converted to int
引数にもその型と一致する値が必要です。数値の見た目でも文字列は数値として渡せません。
直し方: "5" を 5 にします。
よくある誤解
「数字に見えるからint」ではありません。"20" は見た目が数字でもStringです。型は見た目ではなく書き方で決まります。
まとめ
incompatible typesは初級でつまずきやすい項目です。上の5パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。