1

私は単純な関数 B.init を持っています:

p/B.java

package p;
import java.util.*;
public class B {
    public static <T> List<T> init(int n) {
        List<T> l = new ArrayList<T>();
        while (n --> 0) l.add(null);
        return l;
    }
}

A.java

import p.B;
import java.util.*;
class A {
    public static void main(String[] args) {
        f(B.<String>init(5));
    }
    public static void f(List<String> l) {
        System.out.println("l: " + l);
    }
}

期待どおりに動作します:

$ javac A.java && java A
l: [null, null, null, null, null]

p.B.initしかし、静的にインポートしたい:

import static p.B.init;
import java.util.*;
class A {
    public static void main(String[] args) {
        f(<String>init(5));
    }
    public static void f(List<String> l) {
        System.out.println("l: " + l);
    }
}

コンパイルに失敗します:

$ javac A.java && java A
A.java:5: illegal start of expression
        f(<String>init(5));
                  ^
A.java:5: ';' expected
        f(<String>init(5));
                      ^
A.java:5: not a statement
        f(<String>init(5));
                       ^
A.java:5: ';' expected
        f(<String>init(5));
                        ^
4 errors

なんで?クラスをインポートしてクラス名の前に付けずに、静的ジェネリック関数を呼び出す方法はありませんか? 次のように変更できることを知っています。

        List<String> l = init(5);
        f(l);

しかし、別の変数を導入したくありません。( ) をキャストして実行することもできますf((List<String>)(Object)init(5));が、これによりコンパイラの警告が発生します。

before init を削除するだけでこのエラーが発生します (ここで<String>理由を尋ねました):

$ javac A.java && java A
A.java:5: f(java.util.List<java.lang.String>) in A cannot be applied to (java.util.List<java.lang.Object>)
        f(init(5));
        ^
1 error
4

1 に答える 1