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 Object
não é realmente redundante. Por exemplo, <T extends Object & Foo>
fará com T
que fique Object
sob apagamento, enquanto com <T extends Foo>
ele ficará Foo
sob 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.Collections
classe do JDK tem um método com esta assinatura:
public static <T extends Object & Comparable<? super T>> T max(
Collection<? extends T> coll
)
extends Object
realmente é 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 Object
classe.
<? extends Object>
<? extends Object>
significa que você pode passar um objeto ou uma subclasse que estende a Object
classe.
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:
Object
classe.