作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的函数 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));
) 来完成此操作,但这会导致编译器警告。
只需删除 <String>
在 init 导致此错误之前(我问为什么 here ):
$ 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
最佳答案
Java 中没有语法可以在调用站点指定方法的类型参数,而无需使用其包含的类或实例来限定方法调用。请注意,这与静态导入无关。例如,看一下这段代码:
<T> void x(T x) {}
void y() { this.<Object>x(""); }
根本不涉及静态方法,但问题是相同的:在这种情况下,您无法避免显式的 this
。
关于java - 如何将调用静态导入的泛型方法的结果传递给另一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17263535/
我是一名优秀的程序员,十分优秀!