<?> Ve <arasındaki fark nedir? Java Generics'te Object> genişler?


98

Daha önce herhangi bir nesneyi ifade etmek için kullanılan joker karakteri gördüm - ancak son zamanlarda şunları gördüm:

<? extends Object>

Tüm nesneler Object'i genişlettiğine göre, bu iki kullanım eş anlamlı mı?



3
@Dan Bu soruda "? Extends Object" ararsanız hiçbir şey bulamazsınız. Herhangi bir sonuç çıkarabilir miyim diye cevapları okuyorum ama bunun o olduğunu sanmıyorum. Özellikle jeneriklerden bahsetmiyor.
orbfish

@Dan - Bu farklı bir soru. Bu soruyu daha önce görmüştüm ve en azından ince bir farklılıktan bahsettiğimi hatırlıyorum. Bakalım bulabilecek miyim ..
Paul Bellora


1
İşte başlıyoruz: Java'da Sınırsız joker karakterlerin olası kopyası (En az Kevin Bourrillion tarafından yanlış bir yanıt sunuluyor)
Paul Bellora

Yanıtlar:


104

<?>ve <? extends Object>beklediğiniz gibi eşanlamlıdır.

extends ObjectGerçekte gereksiz olmayan jeneriklerle ilgili birkaç durum vardır . Örneğin, <T extends Object & Foo>neden olur Tolmak Objectoysa, silinti altında <T extends Foo>hale gelecektir Foosilme altında. (Kullanılan bir pre-generics API ile uyumluluğu korumaya çalışıyorsanız, bu önemli olabilir Object.)

Kaynak: http://download.oracle.com/javase/tutorial/extra/generics/convert.html ; JDK java.util.Collectionssınıfının neden bu imzaya sahip bir yöntemi olduğunu açıklar :

public static <T extends Object & Comparable<? super T>> T max(
    Collection<? extends T> coll
)

4
Örneğin nasıl bir ilişki kurduğundan emin değilim? (ne <?> ne de <?
Extend

27
@orbfish: Sadece ben bir örnek olarak, bu ilginç bulacağını düşündüm ki ilgilidir extends Objectaslında bir anlamlı. Hatalıysam özür dilerim. En azından sorunuzla karşılaşan diğer insanların ilgisini çekeceğini umuyoruz.
ruakh

@ruakh - Tür parametreleri yerine sınırlı joker karakterlerle ilgilendi, ama en azından sen yanıtladın.
orbfish

1
Bunu orijinal gönderinizde belirtmiş olmalısınız. Bu şekilde cevabı seninle daha alakalı olabilirdi.
liltitus27

19

<?>Kısayol olması gerekmesine rağmen , <? extend object>ikisi arasında küçük bir fark var. <?>değilken yeniden ödenebilir <? extend object>. Bunu yapmalarının nedeni, yeniden yapılandırılabilir türü ayırt etmeyi kolaylaştırmaktı. Bakışlar ister şey olduğunu <? extends something>, <T>, <Integer>nonreifiable bulunmaktadır.

Örneğin, bu kod çalışır

List aList = new ArrayList<>();
boolean instanceTest = aList instanceof List<?>;

ama bu bir hata veriyor

List aList = new ArrayList<>();
boolean instancetest = aList instanceof List<? extends Object>;

daha fazla bilgi için Maurice Naftalin'in Java jeneriklerini ve koleksiyonlarını okuyun


Eğer derleyici onu List <Object> 'e çevirecekse, List <?> Nasıl yeniden oluşturulabilir, böylece türü ne hakkında bilgi? kayıp?
Trismegistos

<?> İn daha çok eski API'lerle geriye dönük uyumluluk için tasarlandığına inanıyorum. <Nesne> ve <? Java 5 sonrası kod olan Nesne> öğesini genişletir.
Dennis C

9

<?>için bir kısaltmadır <? extends Object>. Daha fazla ayrıntı için aşağıdaki paylaşılan bağlantıyı okuyabilirsiniz.


<?>

"?"bilinmeyen herhangi bir türü belirtir, için koddaki herhangi bir Türü temsil edebilir. Tür konusunda emin değilseniz bu joker karakteri kullanın.

ArrayList<?> unknownList = new ArrayList<Number>(); //can accept of type Number
unknownList = new ArrayList<Float>(); //Float is of type Number

Not: <?> herhangi bir şey anlamına gelir. Bu nedenle, Objectsınıftan miras alınmayan Tipi kabul edebilir .

<? extends Object>

<? extends Object>bir Object veya sınıfı genişleten bir alt sınıf geçirebileceğiniz anlamına gelir Object.

ArrayList<? extends Number> numberList = new ArrayList<Number>(); //Number of subclass
numberList = new ArrayList<Integer>(); //Integer extends Number
numberList = new ArrayList<Float>(); // Float extends Number 

görüntü açıklamasını buraya girin

T -
E tipini belirtmek için kullanılır
- K öğesini belirtmek için kullanılır -
V tuşları - değerler
N - sayılar için
Ref:

görüntü açıklamasını buraya girin


"Dolayısıyla, Object sınıfından miras alınmayan Türü kabul edebilir", ancak tüm Java sınıfları, sınıftan miras alınır veya örtük olarak miras alınır Object.
hackjutsu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.