"10年の長きに渡り Java の可変長引数を過信していた話"を読んで確認した

etc9.hatenablog.com

恥ずかしながら、自分も過信していたのでこのブログを読んで確認してみた。

public class 可変長引数テスト {
    
    public static void main(String... args) {

        new 可変長引数テスト().method();
        new 可変長引数テスト().method("hello");
        new 可変長引数テスト().method("hello", "world");

        String str = "hello";
        new 可変長引数テスト().method(str);

        str = null;
        new 可変長引数テスト().method(str);

        new 可変長引数テスト().method(null);

        new 可変長引数テスト().method((String) null);

        new 可変長引数テスト().method((String[]) null);

    }

    public void method(String... args) {

        System.out.println("*-*-*-*-*-");

        try {
            for (String string : args) {
                System.out.println(string);
            }
        } catch (NullPointerException e) {
            e.printStackTrace();
        }

    }
}

eclipseだと、

new 可変長引数テスト().method(null);

この行で以下のような警告文が表示される。(java1.7だと以下の文章)

タイプ null の引数は、タイプ 可変長引数テスト からの可変引数メソッド method(String…) の呼び出しに対しては String へ明示的にキャストする必要があります。あるいは、可変引数呼び出しに対しては String へキャストすることもできます

  1. コンパイラがこのような警告を吐く記述はちょっと疑うようにした方がいい。
  2. わかりました、ということでStringに明示的にキャストしても、元の記事にあるようにぬるぽで落ちる。
    nullを明示的に渡したいときはStringにキャストしないといけない。

普段意識したことが無かったので、勉強になった。

数年後の自分がこのブログにたどり着くことが無いといいな。