ジェネリクスと演算子オーバーロードの話
@nagise わからなくもないのですが帰結をジェネリクスにすることにこだわりすぎでは。演算子オーバーロードの応用可能性という点でジェネリクスを視野に入れるのは自然ですが、演算子オーバーロードの存在理由という点では別にジェネリクスを考えないことが視野狭窄だとは思いません。
2016-06-09 14:18:30@nagise えーと、Java だと例えば + 記号を任意のクラスでメソッドとして自由に定義できない(scala なら出来る) のが問題だということでしょうか。そこは同意しますが。
2016-06-09 14:21:00@tmiya_ どうでしょうね。ボクシング方式でも、ラッパー型が演算機能を提供してくれるなら演算子オーバーロードがなくても演算可能なのでは。まあJavaのラッパー型はadd()とか提供しないんですが
2016-06-09 14:22:46@nagise 内部に格納されてる型のメソッドは全て透過的に扱うラッパーのような型を便利に定義する文法要素みたいなものがあると、色々便利な気はしますね。Optional型みたいなものにも便利に使えそうな気がする。
2016-06-09 14:30:11Javaに演算子オーバーロードがない点を問題視する向きもあるけども、じゃぁ演算子オーバーロード足したらどうなるかって単なる省略記法にしかならないぞ、と。C++のテンプレートみたいな利便性には繋がらないのではないか。
2016-06-09 14:35:35C++のテンプレート相当というか類似の表現力をJavaに持たせたいというのであれば、単に演算子オーバーロードがあれば良いというわけではなくて…… 今のJavaの実装方式から考えると…… どうすりゃいい?源三郎!
2016-06-09 14:37:45@nagise Scalaのように、メソッド名に記号を許すようにして、 x.op(y)のシンタックスシュガーとしてx op yを導入するのが一番きれいじゃないでしょうか
2016-06-09 14:54:34@bleis うーん……。まぁひとつのシンタックスシュガーで対応できるといえばそうなんですが。個人的にはなんか忌避感があるなあ。「Javaとしては」の忌避感ですけどね
2016-06-09 14:59:11@nagise 型クラスを用意して型クラスに対する関数として演算子を定義、という形も考えれますけど、それこそJavaとしてはアレな気がします。OOPと演算子オーバーロードを同居させたいなら、Scala方式が(個人的には)一番いい方法だとおもいます。
2016-06-09 15:02:23@nagise Javaっぽいやり方としては、interface Numeric<T> { T plus(other: T): T; } みたいなそのインタフェースを実装しているクラスのみが演算子を使える、とかですかね…。一つの演算子だけオーバーライドしたいときに困りますが
2016-06-09 16:11:58@kmizu plusなどのメソッドひとつひとつを関数型インターフェースとして用意して、Numericにはそれら演算子を全部implementsしてはどうかと思うのですが
2016-06-09 16:30:42