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

时间:2010-01-12 16:08:30

标签: java generics

以下是我的问题的跟进:Weird Java generic

如果我有这样的代码:

Casts.<X, T> cast(iterable[index]);

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

<X, T> cast(iterable[index]);

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

5 个答案:

答案 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()