FunctionalInterfaceに内部classやinterfaceがある場合のScalaとJavaでのラムダのキャッシュの動作の違い

この前書いたやつ( Java8のラムダとScala 2.12(LambdaMetafactoryによるシングルトンのキャッシュ) )の発展版というか、Scalaで違い見つけたので貼っておく

https://gist.github.com/xuwei-k/9e988896648fd7389de1350b8cb9d81e


Scalaだと内部traitあるとキャッシュされなくなるが、Javaだとされる。誰か

  • これはScalaではわざとキャッシュしてないのか?
  • Scalaだとやろうとしても不可能なのか?
  • 今後変わる予定はあるのか?

あたりを、scala-internalのメーリングリストか、stack overflowあたりで英語で聞いてくれていいですよ (最初自分でやろうとしたけど、英語面倒になってblogに書いてる)
やっぱり自分で聞いた http://stackoverflow.com/questions/40779511



気づいた経緯やおまけ(?)的な話としては

  • この前blog書いたように scalaz.Semigroupって実装同じ場合はキャッシュされるのかな?
  • scalaz.Semigroup https://github.com/scalaz/scalaz/blob/v7.3.0-M7/core/src/main/scala/scalaz/Semigroup.scala
  • あれ・・・されない・・・なぜだ
  • 内部traitがあるせいか?
  • じゃあ内部traitやめたほうが良いんだろうか?でも、キャッシュのためだけにやめるべきかどうか・・・。scalazにissue立てるか・・・、いやその前にscalaコンパイラ作ってる人になんでJavaと違ってるのか聞くべきか?
  • どっちにしろ、scalaz.Semigroup でやってるような、trait内で内部traitで外部のtraitの実装参照するの、Javaの現状のinterfaceではたぶん無理だろうから、つまりどういうことだ(?)