2010-04-19 16 views
36

Me gustaría escribir un método que pueda aceptar un tipo param (o lo que sea que el método pueda deducir del tipo) y devolver un valor de este tipo para que no tenga que emitir el retorno tipo.Tipo de devolución genérico de Java

Aquí es un método:

public Object doIt(Object param){ 
    if(param instanceof String){ 
     return "string"; 
    }else if(param instanceof Integer){ 
     return 1; 
    }else{ 
     return null; 
    } 
} 

Cuando llamo a este método, y paso en ella una cadena, aunque sé que el tipo de retorno será una cadena que tengo que convertir el objeto de retorno. Esto es similar al int param.

¿Cómo debo escribir este método para aceptar un tipo param y devolver este tipo?

+2

Una pregunta importante es si siempre utilizará String e int. Si ese es el caso, no quiere un método genérico. Desea dos métodos, uno que acepte y devuelva un int y otro que acepte y devuelva un String. –

Respuesta

67

si no quiere tener una interfaz específica para manejar ese material se puede utilizar un método genérico de esta manera:

public <T> T mymethod(T type) 
{ 
    return type; 
} 

cuenta que en De esta manera, el compilador no sabe nada sobre el tipo que planea usar dentro de ese método, por lo que debe usar un tipo vinculado, por ejemplo:

public <T extends YourType> T mymethod(T type) 
{ 
    // now you can use YourType methods 
    return type; 
} 

Pero debe asegurarse de que necesita un método genérico, lo que significa que la implementación de doIt será la misma para todos los tipos con los que planea usarla. De lo contrario, si cada aplicación es diferente solo sobrecargar los métodos, no tendrán ningún problema ya que el tipo de retorno no se utiliza para el enlace dinámico:

public String my(String s) 
{ 
    return s; 
} 

public int my(int s) 
{ 
    return s; 
} 

int i = my(23); 
String s = my("lol"); 
10

de inicio con esto:

public interface Command<T> 
{ 
    T execute(T parameter); 
} 
0

te instaría a NO uso instanceof, sin embargo este código hace lo usted quiere:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     final Main main; 
     final String strVal; 
     final Integer intVal; 
     final Float floatVal; 

     main  = new Main(); 
     strVal = main.doIt("Hello"); 
     intVal = main.doIt(5); 
     floatVal = main.doIt(5.0f); 

     System.out.println(strVal); 
     System.out.println(intVal); 
     System.out.println(floatVal); 
    } 

    public <T> T doIt(final T thing) 
    { 
     T t; 

     if(thing instanceof String) 
     { 
      t = (T)"String"; 
     } 
     else if (thing instanceof Integer) 
     { 
      t = (T)Integer.valueOf(1); 
     } 
     else 
     { 
      t = null; 
     } 

     return (t); 
    } 
} 
+0

de su ejemplo, podría usar la sobrecarga en lugar de usar un método genérico, ya que el tipo de devolución no se usa para vinculación dinámica. – Jack

+1

por supuesto, solo intentaba dar la respuesta que estaba lo más cerca posible del código publicado. Creo que el código publicado en mi respuesta es una idea terrible y no lo usaría, a pesar de hacer lo que se desea :-) – TofuBeer

8

La respuesta corta es no. Tan pronto como se involucre instanceof, los genéricos suelen ser la respuesta incorrecta. Use métodos sobrecargados en su lugar:

public String doIt(String param){ 
    return "string"; 
} 

public Integer doIt(Integer param){ 
    return 1; 
} 

public Object doIt(Object param){ 
    return null; 
} 
+2

6 años después ... habiendo dicho eso, si el tipo declarado es 'Objeto', este ganó No funciona porque la sobrecarga de métodos se realiza en tiempo de compilación en función del tipo declarado de la variable. – Powerlord

+0

es decir, si tiene 'Object var =" Bacon ";' a pesar de ser un 'String', se llamará a' doIt (Object param) '. – Powerlord

Cuestiones relacionadas