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 Object
Gerçekte gereksiz olmayan jeneriklerle ilgili birkaç durum vardır . Örneğin, <T extends Object & Foo>
neden olur T
olmak Object
oysa, silinti altında <T extends Foo>
hale gelecektir Foo
silme 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.Collections
sı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 Object
aslı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, Object
sı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
.