Já vi o caractere curinga usado antes para significar qualquer objeto - mas recentemente vi o uso de:
<? extends Object>
Uma vez que todos os objetos estendem Object, esses dois usos são sinônimos?
Já vi o caractere curinga usado antes para significar qualquer objeto - mas recentemente vi o uso de:
<? extends Object>
Uma vez que todos os objetos estendem Object, esses dois usos são sinônimos?
Respostas:
<?>e <? extends Object>são sinônimos, como você esperaria.
Existem alguns casos com genéricos em que extends Objectnão é realmente redundante. Por exemplo, <T extends Object & Foo>fará com Tque fique Objectsob apagamento, enquanto com <T extends Foo>ele ficará Foosob apagamento. (Isso pode ser importante se você estiver tentando manter a compatibilidade com uma API pré-genérica usada Object.)
Fonte: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; explica por que a java.util.Collectionsclasse do JDK tem um método com esta assinatura:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Objectrealmente é significativo. Se me enganei, peço desculpas. Esperançosamente, pelo menos, será do interesse de outras pessoas que tenham encontrado sua pergunta.
Embora <?>deva ser um atalho para <? extend object>, há uma pequena diferença entre os dois.
<?>é reificável enquanto <? extend object>não é. A razão pela qual fizeram isso é para facilitar a distinção entre tipos reificáveis. Qualquer coisa que se parece com <? extends something>, <T>, <Integer>são nonreifiable.
Por exemplo, este código funcionaria
List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;
mas isso dá um erro
List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;
para obter mais informações, leia os genéricos e coleções Java de Maurice Naftalin
<?>é uma abreviação de <? extends Object>. Você pode ler o link compartilhado abaixo para obter mais detalhes.
<?>
"?"denota qualquer tipo desconhecido, pode representar qualquer tipo em no código para. Use este curinga se você não tiver certeza sobre o tipo.
ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number
Nota: <?> significa qualquer coisa. Portanto, pode aceitar Tipo que não seja herdado da Objectclasse.
<? extends Object>
<? extends Object>significa que você pode passar um objeto ou uma subclasse que estende a Objectclasse.
ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number
T - usado para denotar o tipo
E - usado para denotar o elemento
K - chaves
V - valores
N - para números
Ref:
Objectclasse.