電子書籍の厳選無料作品が豊富!

 お世話になっております。

匿名クラス内のメソッドをオーバーライドするときの引数についての質問なのですが

File d = new File("F:\\dir");

File[] d2 = d.listFiles(new FileFilter(){ public boolean accept(File hoge){

return hoge.toString().endsWith(".txt");

}
}
);

オーバーライドしたacceptメソッドの仮引数のFile型のhogeがありますが

このacceptメソッドの実引数はいつどこから来るのでしょうか?

このacceptメソッドの実引数はどこで「acceptメソッドの呼び出し」で指定すればよいでしょうか?

その他ActionEvent e などの仮引数も謎です。

どうかよろしくご指導お願いいたします。

A 回答 (4件)

File.javaを見てみることをお勧めするわ。


内部でacceptを呼び出しているから。

この回答への補足

 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プログラマ」は記述する必要がない

という解釈でよろしいのでしょうか?

どうかよろしくご教授お願いいたします。

補足日時:2010/03/05 23:48
    • good
    • 0
この回答へのお礼

訂正です。

回答番号:No.2の補足の16行目

誤「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない

正「JavaのコアAPIの作者」以外の「Javaプログラマ」は自分で記述する必要がない

お礼日時:2010/03/06 01:16

解釈はいい感じよ。


なぜOracleなのかがわからないけど。



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

この回答への補足

 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メソッドの実装はあなた側で自由に考えてよい

補足日時:2010/03/12 01:02
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/04/09 14:16

これは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");
 }
が自動実行されるわけ。


これでどうかな?

この回答への補足

 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);

と できるのか

謎です

どうかよろしくご教授お願いいたします。

補足日時:2010/03/09 02:06
    • good
    • 0
この回答へのお礼

回答番号:No.3の補足の補足

あなた側で
「acceptメソッドの実装」を考えてオーバーライドしてください

(オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい)

「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述

return hoge.toString().endsWith(".txt");

お礼日時:2010/03/12 00:26

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

この回答への補足

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);

引用ここまで

補足日時:2010/03/06 02:22
    • good
    • 0
この回答へのお礼

訂正

回答番号: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");}})が

お礼日時:2010/03/06 07:44

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!