为什么我需要在声明一个通用静态方法时添加<T>
?当你创建一个这样的泛型类的方法为什么静态需要在java中连接<T>?
//doesn't compile
private static T[] finishToArray(T[] r, Iterator<?> it) {}
//compiles
private static <T> T[] finishToArray(T[] r, Iterator<?> it) {}
为什么我需要在声明一个通用静态方法时添加<T>
?当你创建一个这样的泛型类的方法为什么静态需要在java中连接<T>?
//doesn't compile
private static T[] finishToArray(T[] r, Iterator<?> it) {}
//compiles
private static <T> T[] finishToArray(T[] r, Iterator<?> it) {}
:如果我没有编译器会引发错误
class MyClass<T> {
public void doSomething(T input) {}
}
,DoSomething的属于类,所以编译器知道T类型(来自周边班级)。
如果你有一个静态的功能,它可以在任何类,甚至一个非通用之一:
class MyClass {
public static <T> void doSomething(T input) { };
}
如果你离开了在这种情况下,编译器将无法告诉什么键入即可使用。
编辑: 更确切地说:编译器将无法尝试使用泛型类型,并将“T”作为类的实际名称。
应该
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
在非静态方法中,您可以将通用声明的定义放在类实例上。您无法为静态方法执行此操作,因为它们不需要执行实例。
你在这里问的问题并不完全清楚。但是如果你的意思是,上面第二个方法声明中的''是什么,请考虑:如果你没有它,返回类型是什么? –
请回顾[*我如何提出一个好问题?](/ help/how-to-ask) –
不同之处在于,对象方法使用最有可能在类级别定义的类型。静态方法不能使用它们 – Christian