###前提・実現したいこと
Java初心者です。
現在勉強の最中なのですが、以下のようなコードが出てきて困っています。
これは一体何を目的とした判定なのでしょうか?
またどういう原理で動いているのでしょうか?
###該当のソースコード
java
1public boolean testMethod(Class<?> clazz) { 2 if (clazz == Object.class || (clazz == Class.class )) { 3 return true; 4 } 5 return true; 6}
###補足情報
java7を使用しています
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
Object.classやClass.classは、Classクラスのインスタンスです。
と、ドキュメントを貼りましたが、これを見ても何が何だかというのが正直なところだと思います(実際私も半分も理解できていません)。
例えばKSwordOfHasteさんが例に挙げた"this is a string"
はStringクラスのインスタンスですが、
"this is a string".getClass()
は、Stringクラスを表すClassクラスのインスタンスです。
Classクラスは主にプログラム実行中にプログラム自体を読み込んだり書き換えたりする(リフレクションという)用途に使います。
投稿2017/04/06 02:26
総合スコア20649
0
ベストアンサー
一体何を目的とした判定なのでしょうか?
なかなか回答が難しい気がしますが、このメソッドは何も有効なことをしないメソッドとしかいえない気がします。Class型のインスタンスの何を渡しても結果が常にtrueだからです。
もし質問者さんのタイプミスだとして例えば以下のように一方がfalseだと仮定すると、何がしかの意味は持ちますが・・・
(1)
java
1public boolean testMethod(Class<?> clazz) { 2 if (clazz == Object.class || clazz == Class.class) { 3 return true; 4 } 5 return false; 6}
そうだとしても質問者さんが本当に知りたいのが何かを判断するのが難しいです。
(2)
java
1public boolean testMethod(int i) { 2 if (i == 1 || i == 2) { 3 return true; 4 } 5 return false; 6}
このようなメソッドがあったとして「これは何を目的とした判定か」と聞かれても「1か2のどちらかかを判定する」としか言えず、それはメソッドに書いてあることそのものを答えたにすぎないからです。
(1)について何が目的かは言えませんが、何をしているかといえば「引数に渡されたクラスがObjectクラスなのかClassクラスなのかを判定する」ということになります。
質問者さんが本当に知りたいことは何でしょうか?
「クラスって何?」ということでしょうか?
「Classクラスって何?」ということでしょうか?
「クラスを==で比較するというのはどういう意味?」ということでしょうか?
追記1:コメントいただいたので説明を試みます。実は自分には分かりやすい回答が難しく感じます。というのは自分がオブジェクト指向に初めて触れたときにちょっと混乱した経験があるからです。下手な説明をするよりどのように使うかの実例を示してみます。
java
1Object[] variousObjects = new Object[] { 2 new Object(), 3 "this is a string", 4 new Object().getClass(), 5 "this is a string".getClass(), 6}; 7for (Object anObject : variousObjects) { 8 Class<?> aClass = anObject.getClass(); 9 boolean result = testMethod(aClass); 10 System.out.printf("%-5s : %s%n", result, aClass.getName()); 11}
結果の出力は以下のようになります。
true : java.lang.Object
false : java.lang.String
true : java.lang.Class
true : java.lang.Class
この例でvariousObjectsの各要素は全て参照型のオブジェクトなのですが、参照型のオブジェクトの型は「そのオブジェクトのクラス」と同じ意味になります。上のコードでanObject.getClass()としている部分が「変数anObjectの中身にある何かのオブジェクトの型を求める」ことになります。
このメソッドは「あるオブジェクトの型(=クラス)」を引数に渡すとそのクラスが
- java.lang.Objectなのか
- java.lang.Classなのか
- 上記以外か
を判定するメソッドということになります。ところでクラスはnew Object()
のようにプログラムコード上では「単なる名前」であるかのように見えることが多いですが実際は"java.lang.Object"という名前をもった「クラスの実体」が存在します。その実体は前述のようにanObject.getClass()
とすると取り出せます。また同じ型のインスタンスに対してgetClassすると常に同一のクラス実体が得られます。よってクラスどおしの比較は==演算子で行えます。(equalsで比較しても同じ結果になりますが)
...ということになるのですが
スミマセン。わかるように説明できている気がしないです... orz
追記2:質問者さんのコメントを拝見し少し補足します。クラスの話をする際には用語の問題で混乱しがちです。「"a"の型はjava.lang.String型です」といっているときのjava.lang.Stringは「型の名前」、その名前に対応するクラスの実体がありそれが「"java.lang.String"という名前のクラスインスタンス」と言ったらどうでしょう。普段何気なく会話しているときは型の名前もその名前を持つクラスインスタンスもどちらも「長ったらしいので」クラスと呼ぶことが多いです。しかし本質問のような内容をきっちり議論する際には厳密に区別した方がいいと思います。
// クラスの名前の例(変数に代入したり比較したりできません。只の名前であって値ではありません)
import java.lang.String;
class java.lang.String { ... }
java.lang.String name;
if (anObject isinstanceof java.lang.String) { ... }
// クラスの実体の例(変数に代入したり比較したりできる値です)
Class<?> cls;
cls = java.lang.String.class;
cls = "this is a string".getClass();
「値」って何という話になってきますかね・・・ますます混乱してしまうでしょうか・・・?
投稿2017/04/05 10:53
編集2017/04/06 14:48総合スコア18392
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/05 11:05
2017/04/05 15:59
2017/04/05 17:32 編集
2017/04/06 14:04
2017/04/06 14:27 編集
2017/04/06 14:52
2017/04/06 14:57 編集
2017/04/06 15:10
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/04/06 13:50