Android開発の入門書を読んでいて、理解不能なコードがありましたので質問します。
※おそらくJavaの基礎文法がまだ分かっていないために理解不能なのだと思います。
MainActivity内にてオーバーライドしたonCreateの中で、以下のようなコードがあります。
java
1TextView tv = (TextView) this.findViewByID(R.id.textview1);
上記の(TextView)の部分の意味が分かりません。
メソッド名の後に()が来るなら分かりますが、いきなり()で、その後も普通にthisが続くという表記の意味が理解できません。
たとえば、
java
1TextView tv = new TextView();
というコードでしたら、
「tvという変数にTextView型のクラスのインスタンスを生成して入れる」
と言葉で表現できます。(合ってます・・・よね?)
同じように前述のコードを言葉・文章で表現すると、どのようになりますでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答6件
0
ベストアンサー
Activity#findViewById()はView型のインスタンスを返却します。ViewはButtonやTextViewなどのスーパークラスです。そのためTextViewの参照変数に代入するにはダウンキャストをしてあげる必要が出てきます。
ダウンキャストをする理由として、Androidでは一般的にレイアウトをxml、処理をJavaコードで書きます。そのため、xmlで作られたView群とコード内のViewインスタンス群を関連付ける必要があります。xmlとJavaコードの糊付けとしてidとfindViewById()を使用します。
本来であれば戻り型をそのまま使えるようにすればいいのですが、xml内では自作のViewも追加することがあります、そうすると戻り型が特定する方法が難しくなるのでプログラマの責任でキャストをする必要があるのではないでしょうか。
投稿2015/09/09 04:42
総合スコア18155
0
他の方がおっしゃるように、その括弧はキャストです。
findViewByID
は、様々なView
を一元管理するために戻り値がView
になっています。例えそれがTextView
のインスタンスだっとしても、そのままではTextView
固有のメソッドなどが使えません。なのでキャストが必要になります。
このとき、TextView
がView
を継承しているという親子関係から、ダウンキャストとなります。
Javaを含む多くの言語で、ダウンキャストは明示的に行う必要があるため、そのような文法になっています。
「固有のメソッドが使えないから」と書きましたが、実際は可読性のことなども踏まえて、固有メソッドを使おうが使わまいが、キャストするのが一般的となっています。
例として、Button
の一派的な使い方は以下のような感じですが、
Java
1Button button = (Button)findViewById(R.id.button); 2button.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 // ボタンが押されたときの処理 6 } 7});
setOnClickListener
はButton
固有のメソッドではなく、View
に実装されているものを継承により引き継いでいる、あるいはオーバロードしているものなので、キャストしなくても動きます。
Java
1View button = findViewById(R.id.button); 2button.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 // ボタンが押されたときの処理 6 } 7});
ですが、可読性が損なわれますし、前者(キャストする)の方が一般的です。
投稿2015/09/09 05:04
総合スコア1156
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/10 15:48
2015/09/10 16:01
2015/09/10 16:06 編集
2015/09/10 16:11
2015/09/10 16:14
2015/09/10 16:18
2015/09/10 16:23
0
まずは,継承とキャストについて知る必要があると思います.
このページの「5.1.2 参照型の変換」を読んでください.
以下は,それを踏まえた上で読んでください.
このページは,AndroidのTextViewについてのドキュメントです.注目して欲しいのはここです.
java.lang.Object
↳ android.view.View
↳ android.widget.TextView
これは継承関係を示しています.TextViewはViewクラスを継承しているので,TextViewのオブジェクトはViewオブジェクトとしても扱うことができます.
一方,メソッドfindViewByID(int)
はView(として扱われるオブジェクト)を返します.この返り値はこのままで使えるのはViewクラスのメソッドのみで,TextViewクラスのメソッドは使えません.例え実体がTextViewだとしても,今この返り値が見ているデータの領域はViewの領域のみであるためです.
そこで,キャストによりこのViewをTextViewとして扱えるようにしているのです.(もちろん,対象のオブジェクトがTextViewに関係のないオブジェクトの場合はTextViewとして扱えないので,例外を投げます.)こうすることで初めて,このオブジェクトに対してTextViewのメソッドが使えるようになるのです.
投稿2015/09/09 05:05
総合スコア20651
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/10 15:29
2015/09/11 03:48
0
こんにちは。
これは「キャスト」といって、()内に指定したクラスの型にする という意味があります。
おそらく、findViewByID() メソッドの戻り値が Object型 か何かなのではないですか?
TextView tv = (TextView) this.findViewByID(R.id.textview1);
この場合、
findViewByID( R.id.textview1 ) で取得したインスタンスを TextView型 にして
変数 tv に格納しています。
ちなみに、thisがメソッドの前についていますが、これは
findViewByID() がこの処理を記述しているクラスのインスタンスメソッドだからです。
TextView tv = new TextView;
これは誤りです。
コンストラクタはメソッドのようなものなので、
TextView tv = new TextView();
と() がないとエラーになります。
投稿2015/09/09 04:17
総合スコア1844
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/09 04:50
2015/09/09 06:14 編集
2015/09/10 15:52
0
変数の「宣言」と「代入」を分けて説明していきます。
まず「宣言」から。
コピペでやったので意識が薄いと思いますが、
TextView tv = ...
っていうのは「後続の処理でTextViewのオブジェクトをtvという変数名で使いたい」って意図で記述している事になります。
で、ではtvのオブジェクトはどうやって生成するかって話になりますが、
それが「代入」です。
TextViewのコンストラクタで設定するのみのオブジェクトであれば、確かにTextViewをnewしてインスタンス生成すれば良いかもしれません。
しかし、ブラックボックス的な情報が詰まったものでないと、恐らく後続の処理は動いてくれないでしょう。
それで、そのブラックボックス的なものというのが、親クラスで定義している「 this.findViewByID(R.id.textview1)」っていう関数の戻り値という事になります。(これはTextViewの設計者の設計によるものなので、このクラスについてはそういう使い方のものだと鵜呑みにしてください。)
さて、そこで問題となるのが、findViewByIDの戻り値の型です。これが「View」であって「TextView」ではありません。
なので、何らかの形でView→TextViewに変換してあげないといけません。
そこで、ネットを検索すると、TextViewはViewのサブクラスということがわかります。
ここから、findViewByIDの戻り値をTextViewでキャスト対応可能ということがわかります。
そこで「(TextView) this.findViewByID(R.id.textview1);」という右辺になるのです。
これが、親子関係にないクラスであれば、必要なプロパティだけ手書きで設定しなければいけないという煩わしいことになります。
投稿2015/09/13 13:11
総合スコア1124
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
投稿2015/09/09 04:12
編集2015/09/09 04:15総合スコア409
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/09 04:45
2015/09/09 06:18
2015/09/10 15:55
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/09/09 04:56
2015/09/09 06:41
2015/09/10 15:47
2015/09/10 16:36
2015/09/11 03:02
2015/09/11 03:27 編集