@Dan Se você pesquisar "? Extends Object" nessa questão, você não encontrará nada. Estou lendo as respostas para ver se consigo inferir alguma coisa, mas não acho que seja isso. Especificamente, não se trata de genéricos.
orbfish
@Dan - Essa é uma pergunta diferente. Já vi essa pergunta antes e me lembro de pelo menos uma menção a uma diferença sutil. Deixe-me ver se consigo encontrar.
Aqui vamos nós: possível duplicata de curingas ilimitadas em Java (apresentando uma resposta incorreta de Kevin Bourrillion nada menos.)
Paul Bellora
Respostas:
103
<?>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.)
Não estou certo de como o exemplo se relaciona? (já que não usa <?> nem <? extends Object>)
orbfish
27
@orbfish: Relaciona-se apenas no sentido de que achei que você o acharia interessante, já que é um exemplo onde extends Objectrealmente é significativo. Se me enganei, peço desculpas. Esperançosamente, pelo menos, será do interesse de outras pessoas que tenham encontrado sua pergunta.
ruakh
@ruakh - Estava interessado em caracteres curinga limitados em vez de parâmetros de tipo, mas, pelo menos, você respondeu.
orbfish
1
Você deveria ter afirmado isso em sua postagem original. Dessa forma, a resposta dele poderia ter sido mais relevante para você.
liltitus27 de
19
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 =newArrayList<>();boolean instanceTest = aList instanceofList<?>;
mas isso dá um erro
List aList =newArrayList<>();boolean instancetest = aList instanceofList<?extendsObject>;
para obter mais informações, leia os genéricos e coleções Java de Maurice Naftalin
Como List <?> Pode ser reificável se o compilador irá traduzi-lo para List <Object> para informações sobre qual é o tipo de? está perdido?
Trismegistos
O que eu acredito <?> É mais projetado para compatibilidade com versões anteriores de APIs legadas. distinguir com <Objeto> e <? extends Object> que são códigos posteriores ao Java 5.
Dennis C
9
<?>é 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 =newArrayList<Number>();//can accept of type Number
unknownList =newArrayList<Float>();//Float is of type Number
Nota:<?> significa qualquer coisa. Portanto, pode aceitar Tipo que não seja herdado da Objectclasse.
<?extendsObject>
<? extends Object>significa que você pode passar um objeto ou uma subclasse que estende a Objectclasse.
ArrayList<?extendsNumber> numberList =newArrayList<Number>();//Number of subclass
numberList =newArrayList<Integer>();//Integer extends Number
numberList =newArrayList<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:
"Portanto, pode aceitar Tipo que não seja herdado da classe Object", mas todas as classes Java são herdadas ou implicitamente herdadas da Objectclasse.
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á comT
que fiqueObject
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 usadaObject
.)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:fonte
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
mas isso dá um erro
para obter mais informações, leia os genéricos e coleções Java de Maurice Naftalin
fonte
<?>
é 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.Nota:
<?>
significa qualquer coisa. Portanto, pode aceitar Tipo que não seja herdado daObject
classe.<? extends Object>
significa que você pode passar um objeto ou uma subclasse que estende aObject
classe.T - usado para denotar o tipo
E - usado para denotar o elemento
K - chaves
V - valores
N - para números
Ref:
fonte
Object
classe.