¿Cómo puedo llamar a un método genérico con un tipo, cuando se importa de forma estática?

StackOverflow https://stackoverflow.com/questions/4095593

  •  28-09-2019
  •  | 
  •  

Pregunta

He descubierto que se puede llamar un método genérico con un tipo especial, por ejemplo:.

Supongamos que tenemos un método genérico:

class ListUtils {
    public static <T> List<T> createList() {
        return new ArrayList<T>();
    }
}

podemos llamar así:

List<Integer> intList = ListUtils.<Integer>createList();

Pero, ¿cómo podemos llamar cuando se importa de forma estática? por ejemplo:.

List<Integer> intList = <Integer>createList();

Esto no funciona.

¿Fue útil?

Solución

No se puede. Habría que hacer referencia a ella utilizando el nombre de la clase.

Parece que tener:

void foo(List<String> a) {}

y foo(createList()) llamando no infiere del tipo correcto. Por lo que debe utilizar, ya sea de forma explícita el nombre de la clase, como ListUtils.createList() o utilizar una variable intermedia:

List<String> fooList = createList();
foo(fooList);

Por último, guayaba tiene Lists.newArrayList(), por lo que es mejor que volver a utilizar eso.

Otros consejos

Los siguientes obras para mí:

package test;
import java.util.List;
import static test.ListUtils.createList;

public class ListConsumer {
    public static void main(String[] args) {
        List<Integer> list = createList();
        List<String> list2 = createList();
    }
}

No se puede. Se trata de un defecto de diseño en la sintaxis del lenguaje Java. Scala, que es un lenguaje de tipos estáticos más reciente de JVM, corrige esto. (Esto es cómo usted haría que la llamada en Scala: val intList: List[Int] = creatList[Int]()).

Creo Mindas ya ha demostrado que esto debería funcionar con la inferencia, su sintaxis es un poco fuera. Sin embargo, recomendaría que echar un vistazo a Google guayaba, tienen este método exacto y varios otros más útiles disponibles. No tiene sentido volver a inventar la rueda:)

Por lo que he leído, un defecto del mecanismo de importación estática es que se debe especificar el objeto / clase llamando si desea proporcionar parámetros formales. Mindas es correcta, cuando no hay argumentos, el mecanismo de inferencia de tipos va a utilizar el tipo que el valor de retorno de la función se asigna a. El truco viene cuando usted está proporcionando argumentos sin embargo. Si desea evitar tener que especificar el objeto / clase llamando puede escribir pista a través de un elenco de los argumentos tales como:

public static <E> E foo(E e) {}

Number n = foo((Number)3);

Con la indirecta tipo, el tipo de inferencia devolverá un objeto de tipo Número, en lugar de enteros, ya que habría razonado lo contrario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top