• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:匿名クラス内のメソッドをオーバーライド。実引数はいつどこから来るのでしょうか?)

匿名クラス内のメソッドをオーバーライドする際の引数について

このQ&Aのポイント
  • 匿名クラス内でメソッドをオーバーライドする際の引数について質問があります。
  • オーバーライドしたacceptメソッドの仮引数のFile型のhogeの実引数はいつどこから来るのでしょうか?
  • acceptメソッドの実引数はどこで指定すればよいのでしょうか?他の仮引数についても分からないです。

質問者が選んだベストアンサー

  • ベストアンサー
  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

File.javaを見てみることをお勧めするわ。 内部でacceptを呼び出しているから。

noname#179638
質問者

お礼

訂正です。 回答番号:No.2の補足の16行目 誤「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない 正「JavaのコアAPIの作者」以外の「Javaプログラマ」は自分で記述する必要がない

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 jdk-6u18-fcs-src-b07-jrl-17_dec_2009.jar をインストールし、 インストールしたフォルダ\j2se\src\share\classes\java\io\File.java の1134行目に「acceptメソッドの呼び出し」の記述を発見しました(listFilesメソッドの定義の中)。 これは 「acceptメソッドの呼び出し」は 「JavaのコアAPI」に記述があるので 「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない という解釈でよろしいのでしょうか? どうかよろしくご教授お願いいたします。

その他の回答 (3)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.4

解釈はいい感じよ。 なぜOracleなのかがわからないけど。 後半に関してだけど なんかすごい勘違いしているわよ。 list()メソッドは Fileクラスのメソッドよ。   public String[] list() {     SecurityManager security = System.getSecurityManager();     if (security != null) {       security.checkRead(path);     }     return fs.list(this);   } こんな実装があるでしょ?

noname#179638
質問者

お礼

 質問そのものは解決いたしました。 askaaska様、ありがとうございました。

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 return fs.list(this); これはjava.io.FileSystemクラスのlist()メソッドの呼び出しでは? FileSystem.java内に public abstract String[] list(File f); abstractメソッドなのにどこでlistメソッドを実装(オーバーライド)しているのでしょうか? どうかよろしくご教授お願いいたします。 回答番号:No.3の補足の補足の補足 あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください (オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい) 「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述 return hoge.toString().endsWith(".txt"); 上記の記述はあくまでも文例でありacceptメソッドの実装はあなた側で自由に考えてよい

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.3

これはJavaのインターフェースや抽象クラスを理解していないと なかなか難しいと思うわ。 でも、これらを理解していればそれほど難しいことじゃないんだけど。 File#listFilesでは そのディレクトリ以下のファイルの一覧を取得後 ループでそのファイル1個1個について FileFilter#acceptメソッドを呼んでいるわね? ここまでOK? ここで使っているFileFilterは File#listFilesの引数で渡されてきたFileFilterである。 具体的には new FileFilter(){  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } } こんな実装の匿名クラスだけど。 ここまでOK? つまり、File#listFiles内で実行されるacceptは  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } これなのよ。 ここまでOK? 結論、File#listFilesを実行すると 引数で渡された  public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } が自動実行されるわけ。 これでどうかな?

noname#179638
質問者

お礼

回答番号:No.3の補足の補足 あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください (オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい) 「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述 return hoge.toString().endsWith(".txt");

noname#179638
質問者

補足

 askaaskaさま、ご教授ありがとうございます。 インターフェースや抽象クラスについては存じ上げております。 StringクラスのendsWithメソッドの戻り値はboolean型 public boolean accept(File hoge){   return hoge.toString().endsWith(".txt");  } がabstractなFileFilterクラスの public abstract boolean accept(File f) メソッドの実装(オーバーライド)であることも存じ上げております。 File#listFilesの実引数で渡すFileFilterは 「abstractなFileFilterクラスの匿名サブクラス(継承)」を宣言して acceptメソッドの実装(オーバーライド)をして その「FileFilterクラスの匿名サブクラス」を直ちにnewしている ことも存じ上げております。 解釈ここから 「JavaのコアAPIの作者以外のJavaプログラマ」=あなた 「JavaのコアAPIの作者」=Oracle あなた側で 「JavaのコアAPIのFile.java(Fileクラス)内のstaticではないlistFilesメソッド」を呼び出すときは Oracle側で 「acceptメソッドの呼び出し」を行うので あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください このとき あなた側で 「FileFilterクラスの匿名サブクラス(継承)」を宣言して 「あなた側で考えたacceptメソッドの実装(オーバーライド)」をして その「FileFilterクラスの匿名サブクラス」を直ちにnewして それを 「listFilesメソッドの実引数」にしてください 解釈ここまで この解釈でよろしいのでしょうか? JavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中 filter.accept(f) acceptメソッドの実引数fはJavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中でFile型のfがnewされる記述を発見済み File f = new File(ss[i], this); ss[i]はlistFilesメソッドの定義の中で String ss[] = list(); があり JavaのコアAPIのFile.java内に public String[] list() {略} メソッドの定義があり これはオーバーライドではないと思われる public class File extends Object implements Serializable, Comparable<File> Objectクラスにlist()メソッドは無いため ComparableはcompareToのみのオーバーライド Serializableはオーバーライドの概念が無い 同メソッドの戻り値は return fs.list(this); JavaのコアAPIのFile.java内の127行目に static private FileSystem fs = FileSystem.getFileSystem(); があり jdk-6u18-fcs-src-b07-jrl-17_dec_2009.jar をインストールし、 インストールしたフォルダ\j2se\src\share\classes\java\io\FileSystem.java JDK 6 ドキュメントにも載ってない謎のクラス java.io.FileSystem abstract class FileSystem public static native FileSystem getFileSystem(); OS側のファイルシステムをnativeメソッドで呼び出している? FileSystem.java内に public abstract String[] list(File f); File.javaはなぜオーバーライドしていないlistメソッド を使って return fs.list(this); と できるのか 謎です どうかよろしくご教授お願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

この new で作ったオブジェクトに対して acceptメソッドを呼び出すときに与えられる.

noname#179638
質問者

お礼

訂正 回答番号:No.1の補足の1行目 誤 listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilterが 正 listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilter(実引数はFileFilter型のサブクラス型でこの実引数は「JavaのコアAPIの作者」以外の「Javaプログラマ」が自分で記述する。質問の例ではnew FileFilter(){ public boolean accept(File hoge){ return hoge.toString().endsWith(".txt");}})が

noname#179638
質問者

補足

listFilesメソッド(JavaのコアAPIのj2se\src\share\classes\java\io\File.java内にlistFilesメソッドの定義がある)のFileFilter型の仮引数のfilterが (JAVA RESEARCH LICENSEですが事件番号 昭和51年(オ)第923号 パロディ事件 (昭和55年)3月28日 最高裁第三小法廷 の判例上 引用は問題ないかと思います) 引用ここから 出所の明示 著作者名 Sun Microsystems(現在のOracle) filter.accept(f) 引用ここまで を呼び出すようです。 上記acceptメソッドの実引数fはJavaのコアAPIのFile.java内のstaticではないlistFilesメソッドの定義の中でFile型のfがnewされる記述を発見済み ↓その記述はコレ(JAVA RESEARCH LICENSEですが事件番号 昭和51年(オ)第923号 パロディ事件 (昭和55年)3月28日 最高裁第三小法廷 の判例上 引用は問題ないかと思います) 引用ここから 出所の明示 著作者名 Sun Microsystems(現在のOracle) File f = new File(ss[i], this); 引用ここまで

関連するQ&A