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
^
だってさ。まぁ、そうだよね。
型がなけりゃぁ生じない問題だけに、自分で勝手に問題を作る、どっかの事務と似ていると思ったのは秘密...
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment