ジェネリクスとオーバーロード

by orekyuu 0 Comments

最近public boolean equals(Hoge)のようにオーバーロードしているequalsメソッドを見かけたので気になって調べてみた。
意図としては「Hogeでオーバーロードしとけばキャストの検査とかいらなくね?」というのがあるんだと思う。たぶん。
で実際正常に動くのか。

Hogeクラスにintのidをもたせてidを比較するequals(Hoge)を作成し、HashSetに追加してみる。
で、だめでした。

どうやらboolean equals(Object)の方が使われている様子。
ジェネリクスが怪しいなということで次のコード

public class Hoge {
 
    private int id;
 
    public Hoge(int i) {
        id = i;
    }
 
    public boolean equals(Hoge obj) {
        return obj.id == id;
    }
 
    @Override
    public int hashCode() {
        return id;
    }
}
public class Main {
    public static void main(String[] args) {
        Hoge hoge = new Hoge(1);
        Hoge hoge1 = new Hoge(1);

        System.out.println(hoge.equals(hoge1));
        System.out.println(isEqual(hoge, hoge1));

    }

    public static <T> boolean isEqual(T hoge, T hoge2) {
        if (hoge == null || hoge2 == null) {
            return false;
        }
        return hoge.equals(hoge2);
    }
}

出力結果
true
false
となりました。

理由をTwitterで聞いてみたんですが、境界が指定されていないTにはどの型がバインドされる可能性もあるので、それを受け止められるのはObjectだけとなり、引数がObjectのequalsが使用されているということでした。
たとえば<T extends Hoge>とすればhoge.equals(Hoge)が呼び出されるっぽい。

ということでequalsでオーバーロードするのは使えないよって話でした。(たぶんやってる人いないと思うけど

2015年あけましておめでとうございます

by orekyuu 0 Comments

あけましておめでとうございます。
今年も一年頑張るぞい!

今年はJavaEEとか鯖サイド勉強しようと思ってます。
あとは今年で3回生なので就職のことも考えないとですね・・・うっ頭が。

それはさておき書き初めです。
今年はセミコロンレスJavaというのがあると聞いたことがあるのでチャレンジ
0から2015までカウントしながらのFizzBuzzですね。

https://gist.github.com/orekyuu/ca569e67b27cb8e837fd

peek見つけるまで悩んだのと、完全修飾名でimport書かなくて済むことを完全に忘れていたので時間かかりました・・・

今年もよろしくお願いします。