2010-11-27 9 views
5

Soy nuevo en Java pero no en la programación (normalmente código en Ruby). Una cosa que he visto en ejemplos de código Java es el uso de <> en lugar de() para pasar parámetros a un objeto. A continuación se muestra un ejemplo de código (tomado de un tutorial de Google Web Toolkit):¿Qué significa el objeto <String> en Java?

public void onValueChange(ValueChangeEvent<String> event) { 
    String token = event.getValue(); 

    // depending on the value of the token, do whatever you need 
    ... 
} 

¿Tiene que ver con la colada o es algo más? ¿Puede alguien explicarme qué significa o para qué se usa? ¡Gracias!

Respuesta

4

Esa es una type parameter para una clase genérica. Básicamente, un ValueChangeEvent<String> representa un evento que notificó a los oyentes que un valor ha cambiado, y en este caso el valor es del tipo String.

Es más fácil de entender con el ejemplo estándar en el marco de las colecciones:

Un List<String> es una List que contiene String objetos. La ventaja sobre el solo uso del "tipo sin formato" List es que el compilador rechazará el código que coloca cualquier objeto excepto String en List<String>, y permitirá que los objetos recuperados se usen como String sin conversión.

Básicamente, los genéricos permiten un código más limpio y mejoran la seguridad del tipo general del código Java, haciendo que en muchos casos sea innecesario trabajar con el tipo Object y los valores de conversión del mismo.

3

Se llama genéricos, o parámetros genéricos. Permiten que un método u objeto opere en múltiples tipos de datos mientras se mantiene la seguridad del tipo. Un uso común es especificar cuál es el tipo de objetos almacenados en una colección.

Véase el wikipedia article sobre el tema para obtener más información.

+0

... pero como también lo dirá wiki, los genéricos en Java no son tan seguros por tipo debido al maldito borrado de tipos. – delnan

+0

Ofrecen un tipo de seguridad mucho mejor que los pre-genéricos de java donde tenía que devolver un 'Objeto' y confiar en ti mismo para lanzarlo correctamente, sin ofrecer comprobación en tiempo de compilación. Sí, el borrado tipo chupa bolas algunas veces (especialmente con arreglos), pero es * mucho * mejor que nada. –

0

<> significan los genéricos. Eche un vistazo al Generics. Por ejemplo, List<String> es una lista de cadenas.

0

Esto se conoce como generics en Java. Son similares a templates en C++.

Básicamente le permiten implementar una clase genérica para cualquier tipo y luego, cuando inicializa una variable de esta clase, especifica qué tipo (por ejemplo, String, int, double, etc.) aplica sus cosas. Un buen ejemplo es en una ArrayList, ¿qué tipo debe almacenar el contenedor? La implementación es la misma, solo el tipo es diferente.

+0

Decir que son similares a las plantillas en C++ sería incorrecto IMO ya que las plantillas funcionan fundamentalmente a un nivel muy diferente en comparación con los genéricos. Lectura de Moar: http://stackoverflow.com/questions/36347/what-are-the-differences-between-generic-types-in-c-and-java/498329#498329 –

1

El uso de paréntesis angulares generalmente significar métodos de programación genéricas, que es un estilo de programación, donde los tipos no se declaran al principio, hacer el código mucho más reutilizable.

Por ejemplo:

// Declare the generic class 
public class GenericList<T> 
{ 
    void Add(T input) { } 
} 
class TestGenericList 
{ 
    private class ExampleClass { } 
    static void Main() 
    { 
     // Declare a list of type int 
     GenericList<int> list1 = new GenericList<int>(); 

     // Declare a list of type string 
     GenericList<string> list2 = new GenericList<string>(); 

     // Declare a list of type ExampleClass 
     GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); 
    } 
} 
0

Por lo general se utiliza para que pueda confiar en que un elemento de una colección/lista es un cierto tipo.

Por ejemplo,

ArrayList<String> a = new ArrayList(); 
a.add("Test"); 

myFunctionWhichAcceptsString(a.get(0)); 

Si myFunctionWhichAcceptsString sólo se acepta una cadena como parámetro, no sería capaz de usar un ArrayList normal sin colar el resultado como una cadena, ya que almacena un objeto y Objeto ≠ Cadena. Al hacerlo de esta manera estás diciendo que la lista debe ser solo Strings. Puedes hacer esto para cualquier tipo de objeto.