java.util.function.ToIntFunctionは、なぜjava.util.function.Functionを継承していないのか

Java8の話です。この記事

Java8 の java.util.function package と Scala の対応表

書いた後、java.util.functionパッケージ見て考えていると、ツッコミどころというか疑問点が大量にでてきて、どこからツッコめばいいのかよくわからないのだけれど、手始めにこれから。


http://download.java.net/jdk8/docs/api/java/util/function/Function.html
http://download.java.net/jdk8/docs/api/java/util/function/ToIntFunction.html

つまり、以下のようになっていればいいと思うのですが。

@FunctionalInterface
public interface ToIntFunction<B> extends Function<B, Integer>{
  @Override default Integer apply(B b){
    return applyAsInt(b);
  }
  public int applyAsInt(final B b);
}


もちろん、ToIntFunctionに限らず、似たようなもの全部です。


そうすれば、ToIntFunctionがFunction としても扱えて、(関数合成などするときに)便利だし、ToIntFunctionが渡されるとわかっている場所ではapplyAsIntを直接呼べばよく、

  1. boxingを避けてパフォーマンスを向上させる
  2. java.util.function.Functionとして、統一的に扱える

という2つを大体同時に果たせるのではないかと・・・。ちなみに、Scalaの場合はコンパイラが勝手に上記とほぼ同等のことをやってくれます。

まぁほかのinterfaceを眺めてもわかるとおり、関数合成などを最初から考えてないのだと思いますが・・・。


つい最近になってJava8調べだして、開発の細かい状況など全く追っていなく、ほとんどJavadoc眺めただけでいっているので、*1なにか自分が勘違いしている可能性もありえますが。


実は色々とデメリットもあって、「ToIntFunctionがFunctionを継承していない明確な理由」*2があってそれを知ってる人がいたら教えて下さい。

*1:試しにjava8でコンパイルなどはしている

*2:というか、上記のメリットを諦めないといけないようなデメリット