我想知道只有在方法是静态的情况下才使用泛型方法吗?对于非静态的,您将定义一个泛型类,并且您不必将它作为泛型方法。这是对的吗?
例如,
public class Example<E>{
//this is suffice with no compiler error
public void doSomething(E [] arr){
for(E item : arr){
System.out.println(item);
}
}
//this wouldn't be wrong, but is it necessary ?
public <E> doSomething(E [] arr){
for(E item : arr){
System.out.println(item);
}
}
}
而编译器将强制添加类型参数,以使其成为通用方法,如果它是静态的。
public static <E> doSomething(E [] arr){
}
我不确定我是否正确。
答案 0 :(得分:4)
public class Example<E>{
为实例的方法和字段定义泛型类型。
public void <E> doSomething(E [] arr){
这定义了第二个E
,它与第一个不同,可能会让人感到困惑。
注意:仍然需要void
;)
静态字段和方法不使用类的泛型类型。
public static <F> doSomething(F [] arr) { }
private static final List<E> list = new ArrayList<>(); // will not compile.
答案 1 :(得分:3)
假设您声明Example<String> example = new Example<String>();
。
public void doSomething(E [] arr)
会期待String[]
参数public <E> void doSomething(E [] arr)
会指望任何类型的数组(它与E
中的Example<E>
不一样)public static <E> void doSomething(E [] arr)
期望任何类型的数组在任何情况下,由于您的Example<E>
可以参数化,因此您不能在静态调用中使用E
,因为它将取决于实例。这有点像从静态方法调用非静态成员。所以你必须在本地重新定义它。
答案 2 :(得分:0)
考虑java.util.Collection
界面。它被声明为:
public interface Collection<E>{
//...
<T> T[] toArray(T[] a);
}
toArray
是使用类型参数T
的通用实例方法,它与接口声明中的类型参数E
没有任何关系。
这是JDK本身的一个很好的例子,说明了具有通用实例方法的价值。