Java'da Class <?> Ne anlama geliyor?


Yanıtlar:


109

Classparametreleştirilebilir bir sınıftır, dolayısıyla sözdizimini bir tür Class<T>olduğu yerde kullanabilirsiniz T. Yazarak Class<?>, Classherhangi bir türde olabilen ( ?bir joker karakter olan) bir nesne bildiriyorsunuz. ClassTipi bir sınıf hakkında temel bilgileri içeren bir türüdür.

Bu uygulamaya Class<?>saygı göstererek ( Classparametreleş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

ClassNesne 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


7
Bunu yapmanın bir yazı Classolmadan basitçe kullanmanın faydası nedir ? Aynı şeyi temsil ediyor gibi görünüyorlar.
ashes999

1
Bir jeneriğin bütün amacı, sınıf türünü önceden bilmemenizdir diye düşündüm. Aksi takdirde, parametre için belirli bir sınıf türünü kullanmak için yalnızca bir işlev tanımlarsınız. Bu soru işareti hala mantıklı değil.
Brain2000

5
Derleyiciye "Bunun genel bir sınıf olduğunu biliyorum, ancak gerçek türü bilmiyorum veya önemsemiyorum, bu yüzden somut bir tür vermek yerine ?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.
Kayaman

1
Class<?>
Kotlin'in

basitçe Classhangi tipte bir argümana geçilemez Class<?>, Yani Class<?>tüm durumlar için daha uygundur.
petertc

72

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.


8

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.


1
Alıntı "Sınıf <?>, Düz Sınıfa göre tercih edilir" ve "Sınıfın yararı <?>" Diyor. Görünüşe göre blok alıntı, köşeli parantezlerle uyuşmuyor.
Filip

1
Kaçılması gerekiyor. Şimdi
düzeltti

5

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 .

  • sınıfı bilseydin kullanırdın Class<Foo>. Bu şekilde, örneğin çevrim yapmadan yeni bir örnek oluşturabilirsiniz:Foo foo = clazz.newInstance();
  • jenerik ilaçları hiç kullanmazsanız, en azından bir uyarı alırsınız (ve tespit edilmesi zor yan etkilere yol açabileceğinden jenerik ilaç kullanmamanız genellikle tavsiye edilmez)

5

Genelde, bilinmeyen bir tür joker karakter "?" İle temsil edilir. Resmi örnek için burayı okuyun .


3

Bu, (bilinmeyen) herhangi bir şeyin olduğu bir Sınıf anlamına gelir.

Daha iyi anlamak için java jenerikleri öğreticisini okumalısınız

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.