O que é ?

Estou tendo problemas para entender a seguinte syntax:

public class SortedList< T extends Comparable > extends LinkedList 

Eu vejo que a class SortedList estende LinkedList. Eu só não sei o que

 T extends Comparable 

significa.

Meu entendimento até agora é que o tipo T deve ser um tipo que implemente Comparable … mas o que é ?

Super em genéricos é o oposto de se estende. Ao invés de dizer que o tipo genérico do comparável tem que ser uma subclass de T, ele está dizendo que tem que ser uma superclass de T. A distinção é importante porque extends diz a você o que você pode tirar de uma class talvez uma subclass). super diz o que você pode colocar na class (no máximo isso, talvez uma superclass).

Neste caso específico, o que está dizendo é que o tipo tem que implementar comparável a si mesmo ou a sua superclass. Então considere java.util.Date. Implementa Comparable . Mas e quanto a java.sql.Date? Ele implementa o Comparable também.

Sem a super assinatura, SortedList não seria capaz de aceitar o tipo de java.sql.Date, porque ele não implementa um Comparable de si mesmo, mas sim de uma superclass de si mesmo.

É um curinga com limite inferior.

JLS 4.5.1 Argumentos de tipo e curingas

Os curingas são úteis em situações em que apenas o conhecimento parcial sobre o parâmetro de tipo é necessário. […] Um limite superior é significado pela syntax:

 ? extends B 

onde B é o limite superior. […] é permitido declarar limites inferiores em um curinga, usando a syntax:

 ? super B 

onde B é um limite inferior.

Uma List List , por exemplo, inclui List , List e List .

Os curingas são usados ​​para tornar os genéricos mais poderosos e flexíveis; limites são usados ​​para manter a segurança do tipo.

Veja também

  • Guia da linguagem Java / Generics / More Fun com curingas

Quanto a como isso é útil em > > , é quando você tem algo como o Cat extends Animal implements Comparable .

Veja a assinatura de Collections.sort

 public static > void sort(List list) 

Portanto, com um List listOfCat , você pode agora o Collections.sort(listOfCat) .

Se tivesse sido declarado da seguinte forma:

 public static > void sort(List list) 

então você teria que ter Cat implements Comparable para usar sort . Usando o ? super T ? super T curinga ? super T bounded, Collections.sort torna-se mais flexível.

Veja também

  • Efetivo Java 2nd Edition, Item 28: Use curingas limitados para aumentar a flexibilidade da API
    • Além disso, o princípio do PECS: “produtor extends consumidor super

Isso significa que T deve implementar o próprio Comparable O sentido é que, como SortedList é classificado, ele deve saber como comparar duas classs de seu parâmetro T genérico. É por isso que T deve implementar o próprio Comparable

Significa que o tipo T deve implementar Comparable of T ou uma de suas super classs.

Por exemplo, se A estender B , se você quiser usar SortedList , A deve implementar Comparable ou Comparable ou, na verdade, apenas Comparable .

Isso permite que a lista de A s seja construída com qualquer comparador válido.

Considere o seguinte exemplo:

  1. Usando um parâmetro de tipo definido na declaração de class

    class pública ArrayList estende AbstractList … {
    public boolean add (E o) // Você pode usar o “E” aqui SOMENTE porque já foi definido como parte da class

  2. Usando um parâmetro de tipo que não foi definido na declaração de class

     public  void takeThing(ArrayList list) // Here we can use  because we declared "T" earlier in the method declaration 

    Se a class em si não usa um parâmetro de tipo, você ainda pode especificar um para um método, declarando-o em um espaço realmente incomum (mas disponível) – antes do tipo de retorno. Este método diz que T pode ser “qualquer tipo de animal”.

NOTA:

 public  void takeThing(ArrayList list) is NOT same as public void takeThing(ArrayList list) 

Ambos são legais, mas são diferentes. O primeiro indica que você pode passar um object ArrayList instanciado como Animal ou qualquer subtipo de Animal como ArrayList, ArrayList ou ArrayList. Mas, você só pode passar ArrayList no segundo, e não qualquer um dos subtipos.