So-net無料ブログ作成
検索選択

可変長パラメータと配列パラメータの互換性 [Java]

メソッドがオーバーライドされる場合、スーパークラスでは引数型が配列と宣言されたメソッドを、サブクラスで可変長パラメータと宣言したり、スーパークラスで引数型を可変長パラメータと宣言されたメソッドを、サブクラスで配列と宣言したりすると、JDK 5.0リリースではコンパイルができますが、警告メッセージが出力されていました。

たとえば、次のAクラスとBクラスを見てみてください。
class A {
    void f(Object... o) { }
    void g(Object[] o) { }
}

class B extends A {
    void f(Object[] o) { }
    void g(Object... o) { }
}

JDK 5.0では、これらのクラスをコンパイルすると警告メッセージが出ていました。しかし、Java 6では、警告メッセージは何も出ることなくコンパイルされるようになっているようです。JDK5.0がリリースされた時点では、将来はコンパイルエラーされる可能性も考えられていましたが、Java 6では警告は何も出ないようになっているので、将来コンパイルエラーとされる可能性はほとんどないでしょう。

しかし、警告が出なくても、やはり、どちらのオーバーライドも好ましくないでしょう。
class Test {
  public static void main(String[] args) {
    B b = new B();
    A a = b;

    a.f(1, 2, 3);
    b.f(1, 2, 3);

    b.g(1, 2, 3);
    a.g(1, 2, 3);
  }
}

このTestクラスをコンパイルすると次のようにエラーとなります。
Test.java:10: g(java.lang.Object[]) (A 内) を (int,int,int) に適用できません
    a.g(1, 2, 3);
     ^
エラー 1 個

Bクラスのfメソッドは、可変長パラメータと同じように呼び出せています。gメソッドの場合には、参照の型によって、スーパークラスは配列パラメータ、サブクラスは可変長パラメータと見なされていることになります。

[追記: 2009年5月2日]
一部訂正ブログを書いていますので、そちらも参照してください。


スポンサーリンク





nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この記事のトラックバックURL:
※言及リンクのないトラックバックは受信されません。