¿Qué <T se extiende Comparable <T >> media?

David Dong:

Yo estaba buscando a través de los TheAlgorithms repositorio para java y llegaron a esta primera: https://github.com/TheAlgorithms/Java/blob/master/Searches/SearchAlgorithm.java . Veo <T extends Comparable<T>>, y no sé lo que significa esta. Sólo sé un poco acerca de los genéricos y sé que la sintaxis tiene algo que ver con los límites del tipo de parámetro, pero sería genial si alguien pudiera aclarar la forma en que esto tiene que ver con Comparable<T>, y lo que Comparable<T>es.

Hay algunas otras preguntas en este foro similar a la mía ocupan de la aplicación <T extends Comparable<T>>, pero las respuestas no han aclarado lo que realmente Comparable<T>es.

repollo:

En primer lugar, usted tiene la Comparableinterfaz que más o menos se parece a:

public interface Comparable<T> {

    int compareTo(T other);
}

Como se puede ver, el parámetro de tipo de Comparablese utiliza como parámetro del compareTométodo. Típicamente, el argumento de tipo para Tes de la misma clase que implementa el Comparableinterfaz. Esta configuración genérico facilita la comparación de casos del mismo tipo entre sí. He aquí un ejemplo:

public class Name implements Comparable<Name> {

    @Override
    public int compareTo(Name other) {
        // compute & return result
    }
}

Ahora digamos que usted tiene un método que debe devolver el máximo de dos objetos de acuerdo a su orden natural. Método A Tal podría ser similar a la siguiente:

public static <U extends Comparable<U>> U max(U left, U right) {
    return left.compareTo(right) >= 0 ? left : right;
}

Nota: Se utiliza Ucomo variable de tipo en lugar de Tmostrarlo es independiente del Tutilizado en la Comparableinterfaz.

Lo anterior es un método genérico. La variable de tipo Use superior delimitada por Comparable<U>. Lo que esto significa es que el argumento de tipo utilizado en lugar de Udebe poder asignar (es decir subtipo de) Comparable<U>. Por ejemplo, si se utiliza Namecomo el argumento de tipo que funciona porque Namees asignable a Comparable<Name>. La razón para especificar el límite superior, como Comparable<U>es que las necesidades método a llamar compareTocon el fin de funcionar correctamente.

Name name1 = ...;
Name name2 = ...;

Name max = max(name1, name2); // U is inferred to be Name

Como se muestra arriba, que tiene Ucomo el tipo de retorno también permite asignar el resultado a una variable del mismo tipo que los argumentos.


Tenga en cuenta que para una máxima flexibilidad del maxmétodo en realidad debería ser declarado como tal:

public static <U extends Comparable<? super U>> U max(U left, U right) {
    return left.compareTo(right) >= 0 ? left : right;
}

La diferencia es la utilización de Comparable<? super U>como el límite superior en lugar de Comparable<U>. Estos dos Q & A deberían ayudar a explicar por qué el uso ? super Uofrece una mayor flexibilidad:

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=331577&siteId=1
Recomendado
Clasificación