2012-08-09 14 views
5

Me pregunto si usamos el método genérico solo si el método es estático. para no estático, definiría una clase genérica y no es necesario que sea un método genérico. Es eso correcto ?Java: ¿El método genérico solo es estático?

por ejemplo,

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); 
       } 
     } 
    } 

mientras que el compilador le obligará a agregar parámetro de tipo para que sea un método genérico si es estática.

public static <E> doSomething(E [] arr){ 


    } 

No estoy seguro de si estoy en lo cierto o no.

+4

También podría tener métodos de instancia genéricos sin la carga de hacer que su clase sea genérica. –

Respuesta

4
public class Example<E>{ 

define un tipo genérico para los métodos y campos de la instancia.

public void <E> doSomething(E [] arr){ 

Esto define una segunda E que es diferente a la primera y es probable que sea confuso.

Nota: void todavía se necesita;)

campos y métodos estáticos no utilizan los tipos genéricos de la clase.

public static <F> doSomething(F [] arr) { } 

private static final List<E> list = new ArrayList<>(); // will not compile. 
+0

Los campos y métodos estáticos no usan los tipos genéricos de la clase. Porqué es eso ? – peter

+0

Cada instancia de una clase puede tener un tipo genérico diferente. Esto no tiene ningún significado para los miembros estáticos. –

+0

¿Qué hay de los campos y métodos no estáticos? ¿Comparten el tipo genérico de la clase? Quiero decir, ¿tienen que hacerlo? – peter

3

Digamos que usted declara Example<String> example = new Example<String>();.

  • public void doSomething(E [] arr) esperarán un argumento String[]
  • public <E> void doSomething(E [] arr) esperará una matriz de cualquier tipo (que no es la misma E como en Example<E>)
  • public static <E> void doSomething(E [] arr) esperarán una matriz de cualquier tipo

En cualquier caso, dado que su Example<E> se puede parametrizar, no puede usar ese E en una llamada estática, ya que dependerá de la instancia. Sería como llamar a un miembro no estático desde un método estático. Entonces debes redefinirlo localmente.

+0

Podría, por ejemplo, crear un 'Ejemplo ' luego un 'Ejemplo '. Los métodos estáticos no están relacionados con una instancia específica sino con la clase. Por lo tanto, no hay forma de que un método estático pueda resolver 'E', ya que podría haber varios de ellos. – assylias

+0

Mi analogía era que si tienes 'private String abc;' (un campo de instancia), no puedes acceder a él desde un método estático, porque hay una cadena 'abc' por instancia de la clase. – assylias

+0

Entonces, ¿en ese caso tengo que usar cualquier otra cosa que no sea E? ¿Dará un error de compilación si uso E? y qué quiere decir redefinirlo localmente – peter

0

Considere la interfaz java.util.Collection. Se declara como:

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

El toArray es un método de instancia genérica utilizando un parámetro de tipo T, que no tiene relación alguna con el parámetro de tipo E de la declaración de interfaz.

Este es un buen ejemplo del propio JDK que ilustra el valor de tener métodos de instancia genéricos.

Cuestiones relacionadas