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ı?
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ı?
Yanıtlar:
<?>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
)
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.
<?>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
<?>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
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:
Object.