Sorum yukarıdaki gibi. Üzgünüm, muhtemelen bir kopya ama <?>
sonunda ile bir örnek bulamadım .
Neden sadece Class
parametre olarak kullanmıyorsun ?
Sorum yukarıdaki gibi. Üzgünüm, muhtemelen bir kopya ama <?>
sonunda ile bir örnek bulamadım .
Neden sadece Class
parametre olarak kullanmıyorsun ?
Yanıtlar:
Class
parametreleştirilebilir bir sınıftır, dolayısıyla sözdizimini bir tür Class<T>
olduğu yerde kullanabilirsiniz T
. Yazarak Class<?>
, Class
herhangi bir türde olabilen ( ?
bir joker karakter olan) bir nesne bildiriyorsunuz. Class
Tipi bir sınıf hakkında temel bilgileri içeren bir türüdür.
Bu uygulamaya Class<?>
saygı göstererek ( Class
parametreleştirilebilir olduğunun farkındasınız ), ancak parametrenizin belirli bir türe sahip olmasını kısıtlamazsınız.
Jenerikler ve Joker Karakterler hakkında referans: http://docs.oracle.com/javase/tutorial/java/generics/wildcards.html
Class
Nesne ve yansıma hakkında referans (kendi kendine iç gözlem yapmak için kullanılan Java dilinin özelliği): https://www.oracle.com/technetwork/articles/java/javareflection-1536171.html
Class
olmadan basitçe kullanmanın faydası nedir ? Aynı şeyi temsil ediyor gibi görünüyorlar.
?
joker karakter veriyorum" demeniz dışında başka bir yararı yok . . Joker karakteri vermezseniz, derleyici ya türü unuttuğunuzu ya da sınıfın genel olduğunu bilmediğinizi varsayar ve sizi bu konuda uyarır.
Class<?>
Class
hangi tipte bir argümana geçilemez Class<?>
, Yani Class<?>
tüm durumlar için daha uygundur.
Bu <?>
bir canavar. Genellikle kafa karışıklığına ve hatalara yol açar, çünkü ilk gördüğünüzde, sonra inanmaya başlarsınız, herhangi bir java türü<?>
için bir joker karakterdir . Hangisi ... doğru değil. olduğu bilinmeyen tip , hafif ve pis farkı.<?>
Onunla kullandığınızda sorun değil Class
. Her iki satır da çalışır ve derlenir:
Class anyType = String.class;
Class <?> theUnknownType = String.class;
Ancak , koleksiyonlarla kullanmaya başlarsak, tuhaf derleme zamanı hataları görürüz:
List<?> list = new ArrayList<Object>(); // ArrayList<?> is not allowed
list.add("a String"); // doesn't compile ...
Bizim List<?>
herhangi bir nesne türü için uygun bir koleksiyon değiliz. Yalnızca bir türü depolayabilir: mistik "bilinmeyen tür". Tabii ki gerçek bir tip değil.
Bu, Class referansınızın herhangi bir Class nesnesine referans tutabileceği anlamına gelir.
Temelde "Sınıf" ile aynıdır, ancak kodunuzu okuyan diğer kişilere jenerikleri unutmadığınızı gösteriyorsunuz, sadece herhangi bir Class nesnesini tutabilecek bir referans istiyorsunuz.
Bruce Eckel, Java'da Düşünmek:
Java SE5'te, eşdeğer olmalarına rağmen <?> Sınıfı düz Sınıfa tercih edilir ve gördüğünüz gibi düz Sınıf, bir derleyici uyarısı üretmez. <?> Sınıfının yararı, kazara veya bilgisizlik nedeniyle yalnızca belirli olmayan bir sınıf referansı kullanmadığınızı göstermesidir. Spesifik olmayan versiyonu seçtiniz.
Bu bir var jenerik değişmezi. Bu, bu Class
örneğin temsil ettiği sınıf türünü bilmediğiniz , ancak yine de genel sürümü kullandığınız anlamına gelir .
Class<Foo>
. Bu şekilde, örneğin çevrim yapmadan yeni bir örnek oluşturabilirsiniz:Foo foo = clazz.newInstance();