Java:只有静态的泛型方法吗?

时间:2012-08-09 14:16:30

标签: java generics

我想知道只有在方法是静态的情况下才使用泛型方法吗?对于非静态的,您将定义一个泛型类,并且您不必将它作为泛型方法。这是对的吗?

例如,

  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){


  }

我不确定我是否正确。

3 个答案:

答案 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本身的一个很好的例子,说明了具有通用实例方法的价值。