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

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

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

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

506閲覧

インターフェイスもnewするのかと、その処理内容について

RunningReo

総合スコア6

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2020/10/13 14:28

AndroidStudioにて、サンプルコードを元にクイズアプリを作成中です。

その中で、ダイアログを作成しているのですが、3行目のsetPositiveButtonの実装で、第二引数にnew DialogInterface.OnClickListnerと記しているのが気になりました。

インターフェイスは、implementによって実装できるという認識でいるので、かなり戸惑いました。

この引数の正体はどうなるのでしょうか?ご教授の程よろしくお願い致します。

Java

1AlertDialog.Builder Notice = new AlertDialog.Builder(this); 2 Notice.setTitle(notice); 3 Notice.setPositiveButton("NEXT", new DialogInterface.OnClickListener() { 4 @Override 5 public void onClick(DialogInterface dialog, int which) { 6 7 if (Qvolume == quizCount){ 8 Intent journey = new Intent(getApplicationContext(),resultActivity.class); 9 journey.putExtra("RIGHT_ANSWER_COUNT",rightCount); 10 startActivity(journey); 11 }else{ 12 quizCount++; 13 OpenQuiz(); 14 } 15 16 } 17 18 }); 19 20 Notice.setCancelable(false); 21 Notice.show();

また、インターフェイスのコードを見てもこれで、例えばここ(OnClickListner)だとリスナーの実装ができるととても思えません。このインターフェースは、継承もしていないので、この処理だけで完結しているはずですが、どういったことでしょうか?

Java

1 interface OnClickListener { 2 /** 3 * This method will be invoked when a button in the dialog is clicked. 4 * 5 * @param dialog the dialog that received the click 6 * @param which the button that was clicked (ex. 7 * {@link DialogInterface#BUTTON_POSITIVE}) or the position 8 * of the item clicked 9 */ 10 void onClick(DialogInterface dialog, int which); 11 } 12

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

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

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

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

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

guest

回答2

0

ベストアンサー

無名クラスとか匿名クラスという機能です。
インタフェースを実装、またはクラスを継承したクラスをその場で作り、そのクラスをnewするという機能です。

投稿2020/10/13 14:54

swordone

総合スコア20669

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

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

RunningReo

2020/10/14 01:19

ご回答ありがとうございます。 そういった、概念があるのは分かりました。 ただ、インターフェースの場合でもnewするのですか?
swordone

2020/10/14 01:31

あくまでnewするのは、継承/実装して作成した無名クラスのインスタンスです。
RunningReo

2020/10/14 01:48

んー、無名クラスは、その名前の通りにクラス名を記述せず、new (クラス名省略)(implementも省略)DialogInterface.OnClickListner()…ということでしょうか?自分なりの解釈です
swordone

2020/10/14 02:49

「無名クラス」か「匿名クラス」で検索すればいくらでも出てくるので、調べてください。
RunningReo

2020/10/14 03:16

調べた上で解釈しました。 ご説明いただけると幸いです
swordone

2020/10/14 04:09

それでも十分かとは思いますが、クラス(インタフェース含む。以下同じ)を集合の区分と考え、継承・実装して作成したクラスは、親クラスの集合の部分集合として考えるとよりスムーズかと思います。 つまり、new Interface(){}で、そのInterfaceの部分集合に属するインスタンスを作成する、と解釈できます。
RunningReo

2020/10/14 14:15

ご回答ありがとうございます。かなり理解が深まりました。 >つまり、new Interface(){}で、そのInterfaceの部分集合に属するインスタンスを作成する、と解釈できます。 なるほど。部分集合という考え方。腑に落ちました。ちなみに、インターフェースをnewすると、インターフェースをクラスに実装することなく、単体で機能するということでしょうか?
swordone

2020/10/14 14:39

私、こう書きましたよね? あくまでnewするのは、継承/実装して作成した無名クラスのインスタンスです。
RunningReo

2020/10/15 00:19

わざわざ、ご指摘ありがとうございます! 確かに、仰っていましたね。なるほど。インターフェースとクラスを一緒に考えられずに、ややこしく感じてしまいました。
guest

0

第2引数は

java

1new DialogInterface.OnClickListener()

ではなく、

java

1new DialogInterface.OnClickListener() { 2 @Override 3 public void onClick(DialogInterface dialog, int which) { 4 /* 中略 */ 5 } 6}

です。

この2つは意味がぜんぜん違います。

前者はDialogInterface.OnClickListenerのインスタンスを作ろうとしています。
(そしてインターフェースなのでコンパイルエラーです)

後者はDialogInterface.OnClickListenerをimplementしたクラスをその場で定義して、
そのインスタンスを生成しています
implementの内容がDialogInterface.OnClickListener()に続く{}内に書かれています。

java

1class Hoge implememts DialogInterface.OnClickListener { 2 @Override 3 public void onClick(DialogInterface dialog, int which) { 4 /* 中略 */ 5 } 6}

をどこかに定義して
new Hoge()

とするのと処理内容は一緒です。(ただしクラス名はHogeではなく無名になる)

投稿2020/10/14 01:36

編集2020/10/14 02:19
ozwk

総合スコア13553

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

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

RunningReo

2020/10/14 01:59

ご回答ありがとうございます。   しかし、まだ理解できません。 前者の説明は分かりました。ありがとうございます。 後者の >DialogInterface.OnClickListenerをimplementしたクラスをその場で定義 >implementの内容がDialogInterface.OnClickListener()に続く{}内に書かれています。 が、いまいちよくわかりません両者ともにもう少し詳しくご説明いただけないでしょうか?
RunningReo

2020/10/15 00:20

ご回答ありがとうございました。解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問