使用显式类型参数调用静态导入的方法

这是我的问题的后续跟踪: 奇怪的Javagenerics 。

如果我有这样的代码:

Casts. cast(iterable[index]); 

我可以添加静态导入并执行:

  cast(iterable[index]); 

Eclipse不允许这样做。 但是在Eclipse中看到如此多的静态导入错误后,我并不确定。

不,你不能:我刚刚通过一些测试代码证实了这一点。

 PS > javac -version javac 1.6.0_04 

Casts.java

 public class Casts { public static  To cast(final From object) { return (To)object; } } 

Test.java

 import static Casts.cast; public class Test { public static void main(String[] args) { final Integer integer = new Integer(5); // This one compiles fine. final Number number = Casts.cast(integer); // This one fails compilation: // PS> javac Test.java // Test.java:11: illegal start of expression // final Number number = cast(integer); // ^ // Test.java:11: not a statement // final Number number = cast(integer); // ^ final String string = cast(integer); } } 

没有

如果要在调用generics静态方法时提供显式类型参数,则必须在方法前面加上类名称,即使该方法是静态导入的。

Java语法只允许使用指定typename的类型参数。 请参阅JLS中的相应部分https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-MethodInvocation

据我所知,静态导入机制的一个缺点是,如果要提供forms参数,必须指定调用对象/类。 在这个例子中,为什么有两个通用参数并不是很清楚,但是如果你想避免必须指定调用对象/类,你可以通过参数的强制转换来输入提示:

 public static  E foo(E e) {} Number n = foo((Number)3); 

使用类型提示,类型推断将返回Number类型的对象,而不是Integer,否则将返回其他方法。

我很确定答案是否定的 – 如果你想使用generics方法调用,你需要一个对象来调用它( foo.doSomething() )。 如果方法是静态的,则需要类( Foo.doSomething() )。

如果您从类本身的其他地方调用该方法,则甚至是这样。 如果您使用的是非静态方法(即在实例方法中),则可以调用this.doSomething()