ジェネリクス使ったメソッドのオーバーライド

Mapの仕様では、get時に対応する値が存在しない場合はnullを返すことになっている。しかし、valueがStringなMapの時、「nullは勘弁。空文字列で返してくれると嬉しい」なんて思う時もありますよね。そこで、こんな事をしてみようと思った。

Map<String, String> foo = new HashMap<String, String>() {
  @Override
  public String get(String key) {
    String result = super.get(key);
    return result == null ? "" : result;
  }
};

Bar.baz(foo);

が、overrideなのにしぐねちゃが違うって言われちゃいます。HashMapの実装を見てみるとこんな感じ。

public class HashMap<K,V> ... implements Map<K,V> ... {
    ...
  public V get(Object key) {
    ...
  }
    ...
}

んー、どんなシグネチャにすればoverrideできるんだろう。

  • public String get(String key) → しぐねちゃが違う
  • public String get(Object key) → 同様成功!
  • public Object get(Object key) → しぐねちゃが違う
  • public V get(Object key) → Vって何?って言われる。

無名クラスじゃ無理ぃ?orz

追記

コメント頂きまして、うまくいきましたー。なんでさっきはダメだったんだろうorz あとは↓の問題だなぁ〜。