[Java] 修得度

テーマ:
java 修得度問題
↑で、javaの問題が出されていたのでやってみた。
正直面白かったのだけど、結構手こずった・・・
ぱっと答えられたの(3)ぐらいか。。

こっから先は自分なりの回答を書くので、自力で解きたい人は先にリンク先いってください。




(1) スレッドダンプ。だけど動作を説明せよっていわれてもそのメカニズム全然しらないなあと愕然となった。そのうち別の機会にjvmの挙動として調べてみよう・・・
あといつもkill -3でやってたけどSIGQUITのほうがかっこいいな。


(2)
package sample;

class A<A>{
class B<B>{
public void out(){
System.out.print(a);
System.out.print("-");
System.out.println(b);
}

private A a;
private B b;
}

/**
* @param args
*/

public static void main(final String... args){
sample.A<String> instanceA = new sample.A<String>();
sample.A<String>.B<String> instanceB = instanceA.new B<String>();

instanceB.a = "20";
instanceB.b = "test";
instanceB.out();
}
}



(3)
package sample;

class A{
static interface AA{
String value();
}

enum B implements AA{
A,
B,
C;

private B(){

}
public String value(){
switch (this) {
case A:
return "hoge";
case B:
return "fuga";
default:
return "hogehoge";
}
}
}

/**
*
*
* @param args
*/

public static void main(final String... args)
{
System.out.println(B.A.value());
System.out.println(B.B.value());
System.out.println(B.C.value());
}
}


(4) まずmainメソッドのsysout内を分解してみると
C.class.getAnnotation(B.class).value() // D.class
.getAnnotation(B.class).value() // A.class
.newInstance().value() // A#value()

ということでAのvalue()メソッドが最後に呼ばれている。
value()メソッドを分解してみる。
return this.getClass() //A.class
.getAnnotation(B.class).value() //C.class
.newInstance().getClass() //C.class
.getAnnotation(B.class).value() //D.class
.newInstance().value(); //D#value()

今度はDのvalue()メソッドを呼んでいる。
同じように追っかけると、
return this.getClass() //D.class
.getAnnotation(B.class).value() //A.class
.newInstance().getClass() //A.class
.getAnnotation(B.class).value() //C.class
.newInstance().value(); //C#value()

ということで最終的にC#value()が呼ばれるので、"fugafuga"が出力される。

って元記事のはてブみたらscalaのひととかが回答のっけてた・・・
でもだいたいおんなじ感じだった。
いうても結構僕は(2)に手こずりました・・・
低レベルすぎて泣けてくる・・・
AD