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

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

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

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

4回答

45211閲覧

「不適合な型: 〇〇〇〇を〇〇〇〇に変換できません」のエラーを回避してプログラミングするコツ

mr0237

総合スコア164

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2017/01/31 11:20

JAVAの初心者です。説明が下手ですいませんが、JAVAをプログラミングしていると、
「不適合な型: 〇〇〇〇を〇〇〇〇に変換できません」のエラーが頻繁に出てきて困っております。
まだ慣れてないところもありますが、「不適合な型: 〇〇〇〇を〇〇〇〇に変換できません」のエラーを
回避するコツとかはあるのでしょうか?

例えば、ファイル・オープン・ダイアログから選択した画像を表示するプログラムを作りたいときに
showOpenDialogメソッドの戻り値をimageView変数に渡すときに「ImageViewをWindowに変換できません」というエラーが出てきます。

Java

1package rensyuuyou; 2 3import java.io.*; 4 5import javafx.application.Application; 6import javafx.event.ActionEvent; 7import javafx.event.EventHandler; 8import javafx.geometry.Insets; 9import javafx.geometry.Pos; 10import javafx.scene.Scene; 11import javafx.scene.control.Button; 12import javafx.scene.layout.VBox; 13import javafx.stage.Stage; 14import javafx.stage.FileChooser; 15import javafx.scene.image.Image; 16import javafx.scene.image.ImageView; 17import javafx.stage.Window; 18 19public class Rensyuuyou extends Application { 20 File filepath; 21 22 @Override 23 public void start(Stage stage) { 24 stage.setTitle("練習用"); 25 stage.setWidth(2000); 26 stage.setHeight(1000); 27 28 /* 29 画像を表示する 30 */ 31 Image image = new Image(new File 32 ("質問用 その1.jpg").toURI().toString()); 33 ImageView imageView = new ImageView(image); 34 imageView.setFitHeight(500); 35 imageView.setFitWidth(1000); 36 37 38 Button botan = new Button("画像表示"); 39 botan.setPrefSize(900, 30); 40 41 42 /* 43 ボタンを押したときの動作 44 */ 45 botan.setOnAction(new EventHandler<ActionEvent>() { 46 @Override 47 public void handle(ActionEvent event) { 48 FileChooser fileChooser = new FileChooser(); 49 fileChooser.setTitle("画像を開く"); 50 fileChooser.getExtensionFilters().addAll( 51 new FileChooser.ExtensionFilter("イメージファイル", "*.jpg", "*.png")); 52 fileChooser.showOpenDialog(filepath); 53 //↑不適合な型: ImageViewをWindowに変換できません 54 55 } 56 }); 57 /* 58 画像を表示するためのレイアウトコード 59 */ 60 61 VBox imageBox = new VBox(); 62 imageBox.setAlignment(Pos.TOP_CENTER); 63 imageBox.setPadding(new Insets(40, 40, 40, 40)); 64 imageBox.getChildren().addAll(imageView); 65 /* 66 ボタン表示するためのレイアウトコード 67 */ 68 VBox hyouji = new VBox(); 69 hyouji.setAlignment(Pos.CENTER);//中央下に表示 70 hyouji.setPadding(new Insets(30, 30, 30, 30 hyouji.getChildren().addAll(imageBox,botan); 71 stage.setScene(new Scene(hyouji)); 72 stage.show(); 73 } 74 75 public static void main(String[] args) { 76 launch(args); 77 } 78 79} 80

どこかの動画サイトにドキュメントを見ながらこれらを回避する方法があったような気がしますが、このエラーを
回避するコツとかはあるのでしょうか?

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

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

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

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

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

guest

回答4

0

結論としては「型」を意識すると良いかと思います。


質問文の雰囲気から、そもそも「型」の理解が足りていない感じがします。

Javaでは、データ自体が型を持ち、それを格納(代入)する変数もまた型を持ちます。

例えば、以下は不正な式です。

// int型の変数にStringを代入! int num = "123";

この式を含むソースのコンパイルを試みると、「不適合な型」のエラーが出ます。
"123"123とは明確に区別されます。
前者は文字列で、後者は数値です。
そして、文字列が暗黙的に数値に変換されることはありません。
したがって代入は失敗します。
文字列は数値ではありません。
これが「不適合な型」の意味です。

もう一つ別の例として、第1引数にString型、第2引数にint型を受け取り、String型を返す以下のようなメソッドを考えます。
例示用のメソッドなので、処理内容に特に意味はありません。

String example(String str, int n) { return str + n; }

そして、以下のように書くとエラーになります。

char[] result = example('x', "123");

理由は前述の通り、「型」が「不適合」だからです。
char[]Stringでなく、charStringでなく、Stringintでないのです。

このように、変数に代入できる型は予め決まっており、引数として渡せるデータ型も決まっています。
ポリモーフィズムなどの話も絡むと少しややこしくはなるのですが、ここでは置いておきます。

「ImageViewをWindowに変換できません」というエラーも本質的に同じで、「ImageViewはWindowではなく、また暗黙的にWindowとして扱うことはできない」という意味です。

引数の型、戻り値の型を意識するようにしてください。
メソッドは渡された引数に何らかの処理を施した結果を返しています。
「木彫職人に"木材"を渡し、それを"木彫りの熊"に加工してもらう」と聞くと自然に感じますが、「木彫職人に"楽譜"を渡し、それを"油絵"に加工してもらう」と聞くと頭を捻るでしょう。
適切な場所に適切な物を渡して適切な結果を得られるように意識するのです。
それを意識できてはじめてリファレンスが意味を成します。

投稿2017/01/31 19:27

carimatics

総合スコア740

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

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

0

ベストアンサー

最初に調べることを大事にしてください。
ある程度分かったことを順に書いていくのはいいんです。
途中で勘を挟まないようにしてください。

やりたいことを見つけたときの手順を変えてください。

今回のような場合、以下のように辿っていきます。

1.ファイルをダイアログで選択させて、選択されたファイルを開きたい。
2.調査:ファイル選択にはFileChooser を使えばいいらしい。
3.調査;ダイアログ表示にはshowOpenDialogを使えばいいらしい。
4.showOpenDialogの仕様を見に行こう (たぶんここがmr0237さんは常に抜けていてヤマ勘で組んでる)
5.showOpenDialogの引数にはコンポーネント渡すのか…選んだファイルを受け取るのはどうするんだ?
6.とりあえずダイアログ表示したいしshowOpenDialogソースに書いとこ。
7.で、選択したファイルはどうやって受け取ってくるんだ…?リファレンスを読もう…お、getSelectedFile()メソッドあるじゃん!じゃあコレを使って…

と、こんな感じでやりたいことを実現してくれる何かのマニュアルを見ながら繋げていきます。
ずっと同じ言語、同じような環境で仕事してればそのうちマニュアル読まなくても丁寧に作られた関数群ならある程度は勘で済ませられますけどね。

知らないうちは必ず知ることを優先してください。
「調べること」はプログラミングのレベルを上げていくために必須の能力です。

投稿2017/02/01 01:13

haru666

総合スコア1593

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

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

0

「回避」という言い方そのものが変だと思います。頻繁にぶつかるようなら、それはそもそも使い方がわからないまま使っているということです。
精密機械を使い方もわからず使いませんよね?まず説明書を読みますよね?その説明書に相当するのがリファレンスです。

投稿2017/01/31 14:04

swordone

総合スコア20655

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

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

0

showOpenDialogの第一引数に指定できるのはWindowであってFileではないわけですが・・・リファレンスをみるとそれが書いてありますし、やりたいことをするにはどのメソッドを使う必要があるかなども調べることもできます。とはいえクラスもメソッドも膨大な数のライブラリーを使うのに苦労するというのは誰しも通る道だと思います。

コツといっても・・・とにかくリファレンスを頻繁に確認してクラス・メソッドの使い方をだんだんと把握していくという地道な方法しかないんじゃないでしょうか。

ちなみにIDEのサポートがあればクラスにどんなメソッドがあるかや同じメソッドの引数のオーバーロードのバリエーションなんかを自動的に提示してくれたりするのでそうしたものを活用すると効率はずいぶんと違うかも知れませんね。

自分はEclipseとIntelliJしか知りませんがコードの補完サポートはIntelliJが強い気がするのでこれを最大現使うようにしています。もっともjavadocを見ることは依然として多いのですが。

投稿2017/01/31 12:01

KSwordOfHaste

総合スコア18394

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.42%

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

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

質問する

関連した質問