以下是我的问题的跟进:Weird Java generic。
如果我有这样的代码:
Casts.<X, T> cast(iterable[index]);
我可以添加静态导入并执行:
<X, T> cast(iterable[index]);
Eclipse不允许这样做。但是在Eclipse中看到如此多的静态导入错误后,我并不确定。
答案 0 :(得分:9)
不,你不能:我刚刚通过一些测试代码证实了这一点。
PS > javac -version
javac 1.6.0_04
Casts.java
public class Casts
{
public static <From, To> 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.<Integer, Number>cast(integer);
// This one fails compilation:
// PS> javac Test.java
// Test.java:11: illegal start of expression
// final Number number = <Integer, Number>cast(integer);
// ^
// Test.java:11: not a statement
// final Number number = <Integer, Number>cast(integer);
// ^
final String string = <Integer, String>cast(integer);
}
}
答案 1 :(得分:7)
如果要在调用泛型静态方法时提供显式类型参数,则必须在方法前面加上类名称,即使该方法是静态导入的。
答案 2 :(得分:3)
Java语法只允许使用指定typename的类型参数。请参阅JLS https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-MethodInvocation
中的相应部分答案 3 :(得分:2)
据我所知,静态导入机制的一个缺点是,如果要提供形式参数,必须指定调用对象/类。在这个例子中,为什么有两个泛型参数并不是很清楚,但是如果你想避免必须指定调用对象/类,你可以通过参数的强制转换来输入提示:
public static <E> E foo(E e) {}
Number n = foo((Number)3);
使用类型提示,类型推断将返回Number类型的对象,而不是Integer,否则将返回其他原因。
答案 4 :(得分:1)
我很确定答案是否定的 - 如果你想使用泛型方法调用,你需要一个对象来调用它(foo.<T>doSomething()
)。如果方法是静态的,则需要类(Foo.<T>doSomething()
)。
如果你从类本身的其他地方调用方法,这甚至是正确的。如果您使用的是非静态方法(即在实例方法中),则可以调用this.<T>doSomething()
。