2017-07-27 237 views
0

为什么我需要在声明一个通用静态方法时添加<T>?当你创建一个这样的泛型类的方法为什么静态需要在java中连接<T>?

//doesn't compile 
private static T[] finishToArray(T[] r, Iterator<?> it) {} 

//compiles 
private static <T> T[] finishToArray(T[] r, Iterator<?> it) {} 
+0

你在这里问的问题并不完全清楚。但是如果你的意思是,上面第二个方法声明中的''是什么,请考虑:如果你没有它,返回类型是什么? –

+0

请回顾[*我如何提出一个好问题?](/ help/how-to-ask) –

+0

不同之处在于,对象方法使用最有可能在类级别定义的类型。静态方法不能使用它们 – Christian

回答

2

:如果我没有编译器会引发错误

class MyClass<T> { 
    public void doSomething(T input) {} 
} 

,DoSomething的属于类,所以编译器知道T类型(来自周边班级)。

如果你有一个静态的功能,它可以在任何类,甚至一个非通用之一:

class MyClass { 
    public static <T> void doSomething(T input) { }; 
} 

如果你离开了在这种情况下,编译器将无法告诉什么键入即可使用。

编辑: 更确切地说:编译器将无法尝试使用泛型类型,并将“T”作为类的实际名称。

0

应该

private static <T> T[] finishToArray(T[] r, Iterator<T> it) { 

} 

becouse静态泛型方法需要通用的声明<T>,这个声明会从那里这个方法所在的类中不同(如方法可以在通用类为好)

public class MyClass<T> { 

    private static <T> T[] finishToArray(T[] r, Iterator<T> it) { 
    } 
} 

<T> could be different for class and method 
0

在非静态方法中,您可以将通用声明的定义放在类实例上。您无法为静态方法执行此操作,因为它们不需要执行实例。