我有一个简单的函数 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;
}
}
爪哇
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));
) 来实现,但这会导致编译器警告。
简单地删除<String>
before init 会导致这个错误(我在这里问为什么):
$ 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