私は単純な関数 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