Sunday, 30 December 2007

Generic と extends [Java]



なんか、間違っているのかと思いながら、<T extends S>とかと格闘してます。



  class LogicNode {

    public LogicNode node() { return null; }

  }



  class LogicSolver extends LogicNode {

    @Override

    public LogicSolver node() { return null; }

  }



は、普通だと思うんだよな〜 (1.4 では通らなかったらしい...) でも、



  class LogicNode {

    public LinkedList<LogicNode> arguments() { return null; }

  }



  class LogicSolver extends LogicNode {

    @Override

    public LinkedList<LogicSolver> arguments() { return null; }

  }



これは、通らない...



  LogicSolver の arguments() は LogicNode の arguments() をオーバーライドできません。互換性のない戻り値の型を使おうとしました。

  検出値 : java.util.LinkedList<LogicSolver>

  期待値 : java.util.LinkedList<LogicNode>

  public LinkedList arguments() { return null; }



だってさ。まぁ、気持ちはわかるんだけど。LinkedList は、LinkedList の派生クラスではないからなぁ。



@Override が文句言うぐらいは許すんだが、コンパイルも通らない... このためだけにクラス LogicNodeArguments を作るのは、ちょっと抵抗あるかなぁ。



  class LogicNode {

    public LinkedList<LogicNode> arguments(LogicNode n) { return null; }

  }



  class LogicSolver extends LogicNode {

    // @Override

    public LinkedList<LogicSolver> arguments(LogicSolver n) { return null; }

  }



とdummyの引数を付けると通るので、そうしてます。呼出側では this でも食わせときゃいいし。



でも、@Override は通りません。ま、それぐらいは許す。



    メソッドはそのスーパークラスのメソッドをオーバーライドしません。

    @Override

     ^

だってさ。まぁ、そうだよね。



型がなけりゃぁ生じない問題だけに、自分で勝手に問題を作る、どっかの事務と似ていると思ったのは秘密...

No comments: