いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

言語に萌える萌えないというお話は超よくわかります

最近まともに言いたいことが放出出来てない今日この頃ですがー(ぉ

今日はちょっと時間が取れた間なので今までため込んだネタを再確認 → 文章を書いてみたりしていました。 …そしたらちょっと長めに言いたいことが出てきたので先に放出してみたり。



Javaに対する「萌えない」感はなんなんだろうなあ

超解ります!


確かに色々便利な所もある言語ではあるんですが、言語仕様として便利すぎ故に「これ出来ちゃまずいでしょwwww」ってのがあったり、逆に「何で出来ないんだよwwww」ってのがあって見たり。

個人的に便利なんだけど超違和感バリバリなのがこんなコード

interface IFunc
{
  public void Callback();
};

class Hina
{
  private IFunc func;
  public  int   ichigo = 0;

  public void setCallback(IFunc func) {
    this.func = func;
  }
  
  public void call() {
    func.Callback();
  }
};

class Kanaria
{
  private int num = 0;

  public void Func()
  {
    final Hina hina = new Hina();
    hina.setCallback(new IFunc()
    {
      public void Callback()
      {
        num = 10;        // 親元のthisにアクセスできちゃう。
        hina.ichigo = 6; // ローカル変数(hina)にアクセスできちゃう
      }
    });
    hina.call();
  }
};

おかしいですやん!

なんでCallback関数内で num とか hina とか見えてるっすか! thisが指す空間全然違うじゃないっすかwww

……とはいえ、そんなこと言いつつやっぱりコーディング時には便利なのでやっぱり使ってしまうわけで…


というわけで萌えないです。





何で出来ないんだよwww という例としてはこんな感じ。

class Kana
{
  public void func(List<Integer> intList) {
  
  }
  
  public void func(List<Double> doubleList) {
  
  }
};
// ↑ func のオーバーロードは出来ない

おかしいですやん!

(見た目は)別の型なんだから*1オーバーロードできて且つ呼び出し時にも適した型呼べないとおかしいですやん!! と。

似たようなコードで何回ムキムキしたことか。


ちなみにコレ、やっつけな解決方法を最近発見しました。こんな感じ。

class Kana
{
  public void func(List<Integer> intList) {
  
  }
  
  public void func(Collection<Double> doubleList) {
  
  }
};
// ↑OK

おかしいですやん!


萌えない…やっぱり萌えないよ…!! ってか根本的に、型引数に int / double とか組み込み型書けない時点でムキムキしてくるよ…!!

generic に ? でワイルドカード指定とか、(extendsは良いとして) super とかなんだかなぁーと思いつつ Eclipse でカタカタとお仕事する日々でした……





やっぱ template 最高だわ。(ぉ

*1:コンパイル時には同じ型になっちゃう様子