2010-01-14 14 views
6

Acabo de aprender hasta árbol y una cosa que no entiendo es la declaración de clase:¿Qué significa esta declaración de clase en Java?

por ejemplo: clase BinarySearchTree<T extends Comparable<? super T>>.

Ahora, ¿me puede explicar qué hay en el corchete y el "<? super T>"?

¿Alguna buena fuente que me puedas recomendar? Gracias.

Respuesta

15

Esto declara una clase con un único parámetro de tipo genérico. Dado que para el árbol de búsqueda binaria es imperativo que pueda comparar dos elementos, esto debe especificarse para que el compilador pueda verificarlo.

La parte entre paréntesis angulares es el parámetro de tipo T y una limitación para la misma que dice:

  • Cualquiera que sea T es decir, debe extender Comparable (<T extends Comparable<...>>).
  • Dicho Comparable debería poderse comparar con T o con una superclase de T (<? super T>).

Dado que T suele ser algo que restringe la elección a los tipos en los que tiene sentido implementar un árbol de búsqueda.

0

Sun Tutorial es un buen lugar para comenzar a aprender sobre comodines y genéricos.

Java Ranch es también muy bueno para Java "Greenhorns".

1

Los soportes <> son para lo que se conoce como genéricos. Esto es como una plantilla en C++ y te permite crear una única estructura de datos que puede escribirse con fuerza. Por ejemplo, el objeto ArrayList utiliza un genérico para definir qué tipo de artículos están en el ArrayList:

ArrayList<String> - an ArrayList containing Strings 
ArrayList<MyClass> - an ArrayList containing MyClass objects 

Al definir una estructura que hace uso de los genéricos que se utilizan para la notación anterior. La "T" es un marcador de posición para alguna clase que se rellena cuando se crea una instancia de la clase y se le asigna un tipo. Por ejemplo, la definición de ArrayList podría ser algo como esto:

public class ArrayList<T> ... 

La forma más sencilla es simplemente usar MyGeneric<T> y dejar usarse cualquier clase. Sin embargo, en algún momento solo quieres que gereric se use con clases en una cierta estructura de herencia. En este caso específico, Comparable<? super T> significa que este va a ser un objeto que se extenderá Comparable a Compara cualquier tipo de objeto que coincida con T o sea una superclase de T.

+0

Esto también es útil asnwer gracias – gingergeek

0

La frase <? super T> es un comodín e implica que, clase BinarySearchTree puede tomar:
a. un parámetro de tipo (T) que se extiende Comparable
b. y también puede tomar un subtipo (S) cuya matriz se extiende Comparable

El constructo <? super T> se extiende utilidad de clase BinarySearchTree a tipo (s) que implementa Comparable y sus subtipos.

A continuación fragmento de código demuestra esto:

// Below declaration of Helper class doesn't uses the wildcard super 
class Helper<T extends Comparable<T>> { 
    // some helper methods 
} 

abstract class Animal implements Comparable<Animal> { 
    public int compareTo(final Animal o) { 
     // implementation ...   
    } 
    // other abstract methods 
} 

class Mammal extends Animal { 
    // implement abstract methods 
} 

Con la declaración sobre la declaración Helper<Animal> x = new Helper<Animal>() funciona bien.
Pero la declaración: Helper<Mammal> x = new Helper<Mammal>() da el error de compilación
parámetro de tipo de mamífero es no dentro de su límite
(la versión del compilador es javac 1.5.0_06)

Cuando se cambia la declaración de la clase auxiliar a continuación formulario:

class Helper<T extends Comparable<? super T>> { 
    // some helper methods 
} 

entonces la instrucción Helper<Mammal> x = new Helper<Mammal>() no da ningún error de compilación.

Por lo tanto, el uso de caracteres comodín maximiza la utilidad de la clase.

Cuestiones relacionadas