6

我想知道我们是否仅在方法是静态的情况下才使用泛型方法?对于非静态,您将定义一个泛型类,并且您不需要它是泛型方法。那是对的吗 ?

例如,

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


  }

我不确定我是否正确。

4

3 回答 3

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.
于 2012-08-09T14:18:51.713 回答
3

假设您声明了一个Example<String> example = new Example<String>();.

  • public void doSomething(E [] arr)会期待一个String[]论点
  • public <E> void doSomething(E [] arr)将期望任何类型的数组(它与Ein不同Example<E>
  • public static <E> void doSomething(E [] arr)将期望任何类型的数组

无论如何,由于您Example<E>可以参数化,因此您不能E在静态调用中使用它,因为它将依赖于实例。这有点像从静态方法调用非静态成员。所以你必须在本地重新定义它。

于 2012-08-09T14:20:30.087 回答
1

考虑java.util.Collection接口。它被声明为:

public interface Collection<E>{
  //...
  <T> T[] toArray(T[] a);
}

toArray是一个使用类型参数的通用实例方法,它与接口声明中T的类型参数没有任何关系。E

这是 JDK 本身的一个很好的例子,它说明了具有通用实例方法的价值。

于 2012-08-09T14:21:00.797 回答