Neden java.lang.Class'ın getInterfaces() yöntemi, Sınıf <?> [] yerine ve Sınıf <? super T> []?
Sadece bir örnek olarak, aşağıdaki uygulamayı gözden geçirin (sorunun açıklığa kavuşturulması için, 'T' Sınıf bildirilen bir tür parametresi ifade eder):
public class TestClass {
interface InterfaceA{}
interface InterfaceB{}
interface InterfaceC{}
class ClassA implements InterfaceA, InterfaceB, InterfaceC{}
public static void main(String[] args){
Class<? super ClassA> superClass1 = ClassA.class;
Class<? super ClassA> superclass2 = InterfaceA.class;
Class<? super ClassA> superclass3 = InterfaceB.class;
Class<? super ClassA> superclass4 = InterfaceC.class;
for(Class<?> clazz : ClassA.class.getInterfaces()){
System.out.println(clazz.getName());
}
}
}
çıkış biri ne beklenir :
TestClass$InterfaceA
TestClass$InterfaceB
TestClass$InterfaceC
Yani, yukarıdaki örnekte dayanarak, derleyici interfaceâ karşılamak inci yaptığı tanıdığını görebilirsiniz Diğer tüm arayüzler gibi joker karakterinin e. Sezgisel
, ben güvenli olması için aşağıdaki beklenebilir, ama değil: imza o Class döndüren bulunduğunu belirtti
Class<? super ClassA>[] interfaces = ClassA.class.getInterfaces();
derleyici, bir uyarı verir; Bununla birlikte, sınıf için javadoc aşağıda belirtilmiştir: Bu amacın, bir sınıfını temsil
, dönüş değeri bir dizi sınıfı tarafından uygulanan tüm arayüzleri temsil içeren nesneler.
'Bu nesne' örneğimizde ClassA
numaralı durumu belirtir.
ClassA.class.getInterfaces()
sonra bildiğimiz, mantıksal olarak, döndürülen dizide her
Class<?>
ClassA
süper türüne açıklamayı içerecek: Biz diyoruz eğer, bu ifadeye dayanarak.
Java Dil Başvurusu, Üçüncü Basım: From: referans ek noktası olarak
A sınıfı zorunlu olarak doğrudan süper sınıf ve doğrudan superinterfaces yaptığım arayüzleri uygular. Bu (çoklu) arabirim devralma, nesnelerin herhangi bir uygulamayı paylaşmadan (çoklu) ortak davranışları desteklemesine izin verir.
bu ve şartnamenin diğer kısımlarını okurken, bir sınıf T
tarafından herhangi bir sınıf veya arabirim uygulanan veya exteneded sınırlarının <? super T>
içine düşeceği düşünürdüm.
REDAKTE:
Benim soru için hiçbir somut neden olmadığı ileri sürülmüştür. Bir örnek verecek:
1 import java.util.Map;
2 import java.util.HashMap;
3
4 public class MapWrapper<T> {
5 private final Map<Class<?>, OtherClass<T,?>> map = new HashMap <Class<?>, OtherClass<T,?>>();
6
7 public <W> void addToMap(Class<W> type, OtherClass<T,? super W> otherClass){
8 map.put(type, otherClass);
9 }
10
11 public <W> OtherClass<T,? super W> getOtherClassForAnyInterface(Class<W> type){
12 if(type.getInterfaces()!=null){
13 for(Class<?> interfaceType : type.getInterfaces()){
14 // Here, a cast is necessary. It throws a compiler warning for unchecked operations (rightfully so)
15 OtherClass<T,? super W> otherClass = (OtherClass<T,? super W>)getOtherClassForInterface(interfaceType);
16 if(null!=otherClass){
17 return otherClass;
18 }
19 }
20 }
21 return null;
22 }
23
24
25 public class OtherClass<T,V> {}
26
27 }
sorun hattı Doğru tipini almak için <? super W>
yayın yapmak için var 15. altındadır. Derleyici uyarısı bastırılabilir, ancak haklı mı? Bu yayınlamanın doğru olmadığı bir senaryo var mı?
10 Sınıf Sınıfının gerçekten de herhangi bir üst sınıfını kullanan bu tür yöntemlere sahip olmayabilir, ancak bir türün kendisini temsil ettiğini, süper türler hakkında bilgi sağladığını iddia eder. Class's getSuperclass() yöntemine bakarsanız, dönüş türü "Sınıf super T>" şeklindedir. Bu durumda, getInterfaces() 'in bana benzer şekilde geri dönmesi daha da uygun görünmektedir. Düşündükçe, Class'ın sınırlandırılmış joker karakterine izin vererek bu yöntemlerden hiçbirini kullanamayacağını düşünürdüyse, Class neden " super T>" olarak tanımlanmış bir süper sınıf sağlar? –
sager
Bu, muhtemelen API tasarımcısı tarafından bir hata. Zaten bunun önemli olmadığını tartışıyorum. – irreputable
Bu şekilde Class kullanmanın somut bir örneğini ekledim. Artık görevde kendisi var. – sager