- ベストアンサー
匿名クラス内のメソッドをオーバーライドする際の引数について
- 匿名クラス内でメソッドをオーバーライドする際の引数について質問があります。
- オーバーライドしたacceptメソッドの仮引数のFile型のhogeの実引数はいつどこから来るのでしょうか?
- acceptメソッドの実引数はどこで指定すればよいのでしょうか?他の仮引数についても分からないです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
File.javaを見てみることをお勧めするわ。 内部でacceptを呼び出しているから。
その他の回答 (3)
- askaaska
- ベストアンサー率35% (1455/4149)
解釈はいい感じよ。 なぜOracleなのかがわからないけど。 後半に関してだけど なんかすごい勘違いしているわよ。 list()メソッドは Fileクラスのメソッドよ。 public String[] list() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkRead(path); } return fs.list(this); } こんな実装があるでしょ?
お礼
質問そのものは解決いたしました。 askaaska様、ありがとうございました。
補足
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)
これは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"); } が自動実行されるわけ。 これでどうかな?
お礼
回答番号:No.3の補足の補足 あなた側で 「acceptメソッドの実装」を考えてオーバーライドしてください (オーバーライドのルールを守ってacceptメソッドの実装をあなた側で自由に考えてよい) 「あなた側で考えたacceptメソッドの実装(オーバーライド)」は以下の記述 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); と できるのか 謎です どうかよろしくご教授お願いいたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
この new で作ったオブジェクトに対して acceptメソッドを呼び出すときに与えられる.
お礼
訂正 回答番号: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");}})が
補足
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); 引用ここまで
お礼
訂正です。 回答番号:No.2の補足の16行目 誤「JavaのコアAPIの作者」以外の「Javaプログラマ」は記述する必要がない 正「JavaのコアAPIの作者」以外の「Javaプログラマ」は自分で記述する必要がない
補足
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プログラマ」は記述する必要がない という解釈でよろしいのでしょうか? どうかよろしくご教授お願いいたします。