SORU
14 Aralık 2009, PAZARTESİ


Yansıması ile Java genel bir parametre türü

Genel bir parametre türünü elde etmek mümkün mü?

Bir örnek:

public final class Voodoo {
    public static void chill(List<?> aListWithTypeSpiderMan) {
        // Here I'd like to get the Class-Object 'SpiderMan'
        Class typeOfTheList = ???;
    }

    public static void main(String... args) {
        chill(new ArrayList<SpiderMan>());
    }
}

CEVAP
20 Aralık 2012, PERŞEMBE


@Açıklamaya DerMike gelen cevap yıkmak için denemek istiyorum:

İlk olarak, tür kaldırma FIRSATLAR anlamına gelmezortadan kaldırırçalışma zamanında tür bilgileri. Derleme zamanı tür denetlemesi ve çalışma zamanı tip uyumluluğu aynı dilde Bir Arada sağlayan bir yöntem. Bu kod bloğu da anlaşılacağı gibi, bu yazılım ve programları sildim tür bilgileri sadece atmalarını kontrol ve malzeme ile ilgili değil--korur.

İkinci olarak, bu sağlar genel tür bilgi için bir genel sınıf tam olarak bir seviye yukarı hiyerarşiyi gelen beton türü kontrol ediliyor--yani soyut bir üst sınıf olan genel tür parametreleri bulabilirsiniz beton türleri ilgili kendi tür parametreleri için bir somut uygulama kendisidoğrudanburadan alır. Eğer bu sınıf soyut olmayan ve örneği, ya da somut uygulama iki kat aşağıda, bu ise yaramaz (gerçi biraz jimmying yapabiliriz bunu uygulamak için herhangi bir önceden belirlenmiş sayıda düzeyinin ötesinde bir veya en düşük sınıf olan X genel tür parametreleri, vesaire).

Neyse, açıklama için. Burada kodu yine referans kolaylığı için hatları ayrılır

1# Class genericParameter0OfThisClass = 
2#     (Class)
3#         ((ParameterizedType)
4#             getClass()
5#                .getGenericSuperclass())
6#                    .getActualTypeArguments()[0];

'Biz' bu kodu içeren genel türler ile soyut bir sınıf olabilir. Kabaca içinde bu sesle okur:

  • 4 hat mevcut beton sınıfı alır' Sınıf örneği. Bu bizim acil soyundan beton türünü tanımlar.
  • Hat 5 sınıf' Türü olarak; bu bize. supertype alır Parametrik bir tür olduğumuz güvenle kendimizi ParameterizedType (3 hat) dökme edebiliriz. Anahtar Java bu Tür nesne belirlediğinde, yeni ParameterizedType örnek tip bilgileri yazın bizim parametreleri ile ilişkilendirmek bilgileri çocuk mevcut kullanmasıdır. Şimdi bizim jenerik için beton türleri ulaşabiliriz.
  • Line 6 sınıf kodu ilan için türleri olarak bizim jenerik girmesine dizisi alır. Bu örnekte ilk parametre dönüyoruz. Bu Türü olarak geri geliyor.
  • Hat 2 Son Türü bir Sınıf için geri çevirir. Bu güvenli çünkü biliyoruz ne tür bizim genel tür parametreleri giyinemeyecek ve teyit ederler Tüm Dersler (emin değilim nasıl Java bir gider konusunda genel bir parametre yok bir Sınıf örneği ile ilişkili, aslında).

...ve bu oldukça fazla. Yazın kendi somut uygulama bizim kendimizi içine geri itmek bilgi ve erişim için bir sınıfı işlemek. yapabileceğimiz iki katına getGenericSuperclass() ve iki düzeyleri, ya da ortadan kaldırmak getGenericSuperclass() ve get değerleri için kendimizi bir beton türü (uyarı: ben değil test bu senaryolar, öyle değil mi gelip beni henüz).

Alır zor eğer beton çocuk olmak bir rasgele sayı şerbetçiotu uzakta, ya da eğer somut ve son, ve özellikle zor eğer beklediğiniz herhangi bir (degisken derin) çocuklar için kendi jenerik. Ama genellikle bu şekilde daha fazla para alıyor o yüzden bu düşünceler etrafında tasarım.

Umarım bu birileri yardım etti! Bu yazı çok eski tanıyorum. Muhtemelen bu açıklama kelepir ve diğer sorularınız için saklayacağım.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • GWTLecturer

    GWTLecturer

    18 EKİM 2012
  • UCBerkeley

    UCBerkeley

    3 Mayıs 2006