抽象化の恩恵をあきらめずに、インスタンス化可能なクラスを拡張して、equals 契約を守ったまま、値要素を追加する方法はない。 equals をオーバーライドする時は、常に hashCode をオーバーライドする ゼロではない定数(たとえば17)を result(int型)に保存 意味のあるフィールドに対して、次を行う boolean なら (f?1:0) byte,char,short,int なら、(int)f long なら、(int)(f^(f>>32)) float なら、Float.floatToIntBits(f) double なら、Double.doubleToLongBits(f) を行い、long と同様の変換 参照なら、オブジェクトのhashCode() null なら 0 配列なら、各要素を フィールドとして扱う result = 31 * result + c