<?> 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.