Bu, Douyin'deyken iyi cevaplayamadığımı hissettiğim bir soru. Çünkü odak noktam sadece T'nin Object ile yer değiştirmesi sorunu etrafında ve getireceği sorunları açıklamadım.
Aslında, bu soruyu sık sık kullanıyoruz, hatta sık sık kullanıyorsunuz, ancak buna dikkat etmediniz, ancak bu soruyu görüşmeci tarafından yakalanması kolay oluyor. Önce bir kod parçasına bakalım.
Liste listesi = new ArrayList (); List listString = new ArrayList < Dize > (); List listInteger = new ArrayList < Tamsayı > ();Bu birkaç kod parçası basit, kaba ve güçlü bir aşinalık duygusuna sahip. Sonra bu üç farklı kod parçasına bir 1 sayısı ekleyeceğim.
Bir okuyucu olarak, şimdi siyah bir soru işaretiniz olabilir mi? ? ? ? Bir sürü sorunuz olmalı, bu açıkça farklı, bu nasıl mümkün olabilir.
public class Ana { public static void main (String args) { Liste listesi = new ArrayList (); List listString = new ArrayList < Dize > (); List listInteger = new ArrayList < Tamsayı > (); Deneyin { list.getClass (). getMethod ("add", Object.class) .invoke (liste, 1); listString.getClass (). getMethod ("add", Object.class) .invoke (listString, 1); // İkna edici olmayan okuyucular için, denemek için onu bir dizeye değiştirebilirsiniz. listInteger.getClass (). getMethod ("add", Object.class) .invoke (listInteger, 1); } catch (İstisna e) { e.printStackTrace (); } System.out.println ("liste boyutu:" + list.size ()); System.out.println ("listString boyutu:" + listString.size ()); System.out.println ("listInteger boyutu:" + listInteger.size ()); } }Üzgünüm, resimler var ve gerçek, onu yeni ekledim, eğer inanmıyorsanız, gerçekten yardımcı olamam.
Yukarıdakiler genel bir silme işleminin bir tezahürüdür, ancak daha iyi bir anlayış için, elbette daha derin olması gerekir. Liste çok büyük olmasına rağmen, ona bakmak imkansız değil.
Doğrulamak için iki önemli nokta:
Aslında, bu sözde jenerik T'nin sonunda bir Nesneye dönüştürüleceğini ve sonunda zorla dönüşüm yoluyla bir dönüşüm gerçekleştirileceğini anlayabilirsiniz. Buradan, verilerimiz önden geldiğinde neden Dize tipi verilerin doğrudan Tamsayı tarafından alınabileceğini de öğrenebiliriz.
(1) Zorunlu tip dönüştürme
Yukarıdaki yazımızda bahsettiğimiz bu problemin bir sonucu olarak yansıtma yoluyla eklediğimizde verilerimizde hatalar oluşacaktır.
Listede isek < Tamsayı > Farkında olmadan String tipi bir değer eklemek, bu kadar büyük bir hata hakkında kiminle konuşmalıyız?
(2) Referans geçme sorunu
Yukarıdaki soruda, daha sonraki aşamada T'nin Nesneye kaçacağını söylemiştik, sonra da referansa bir dönüşüm gerçekleştiriyoruz, uygulanabilir mi?
Liste < Dize > listObject = new ArrayList < Nesne > (); Liste < Nesne > listObject = new ArrayList < Dize > ();Böyle yazarsanız, inceleme aşamamızda bir hata bildirilecektir. Ama mantıksal anlamda, gerçekten yanılıyor musun?
İlk çözümümüzün doğru olduğunu varsayarsak , Daha sonra aslında bir grup Object verisini depolamak ve daha sonra yukarıda bahsedilen zorunlu dönüştürme ile bunu String türüne dönüştürmek. Ama aslında, bir ClassCastException problemi olacaktır, çünkü Object her şeyin temel sınıfıdır, ancak zorunlu dönüştürme, alt sınıfın ebeveyn sınıfa hazırlaması için bir ölçüdür.
İkinci çözümümüzün doğru olduğunu varsayalım Şu anda, yukarıdaki veri dizisine göre saklanır, ancak bunun anlamı nedir? Sonunda, hala Nesne olmalısın, sadece Nesne de olabilirsin.
Aslında çok basit.Eğer halka açık bazı dersler gördüyseniz ve gelmek istiyorsanız, böyle bir kullanım görmüş olacaksınız.
public class Bölüm < T ebeveyni uzatır > { özel T val; public T getVal () { dönüş değeri; } public void setVal (T val) { this.val = val; } }Önceki Bölüme kıyasla, daha fazlasına sahip < T ebeveyni uzatır > Aslında bu, temel sınıfın yeniden planlanması işlemidir, derlenmiş olsa bile, sanal makine, verileri doğrudan Object ile değiştirmek yerine, veriyi Parent'e dönüştürmeyi bilecektir.
Bu bölümün fikri, Java jeneriklerinde extends ve super arasındaki farktan mı geliyor?
Yukarıdaki çözümden bahsettik, kullan < T ebeveyni uzatır > . Aslında bu sadece bir çözüm, farklı senaryolarda farklı kullanım yöntemleri eklememiz gerekiyor. Ek olarak, görevli de bu yöntemin kullanılmasını savunuyor, ancak yukarıda belirtilen hatalarımızdan kaçınmak için doğal olarak bazı kullanım senaryoları vermemiz gerekiyor.
İki senaryoya dayanmaktadır, biri genişletilmiş, diğeri devralınmıştır. Aşağıda örnek olarak bir liste kullanılmıştır.
Mirasın faydası nedir?
Aslında beklediği şey, bu listenin tamamının verilerinin temelinin ebeveynimizden gelmesidir, böylece bu şekilde elde edilen tüm insanların ebeveyn sınıfı aslında ebeveynimizdendir, bu listeye Ebeveyn ailesi diyebilirsiniz. Dolayısıyla bunun sık okumaya uygun bir çözüm olduğu da söylenebilir.
Tabak < Meyve uzatır > p1 = yeni Plaka < elma > (yeni Apple ()); Tabak < Meyve uzatır > p2 = yeni Plaka < elma > (new Beef ()); // kontrol başarısız oldu // Değiştirilen veriler geçmez p1.set (yeni Muz ()); // Veri toplama için her şey normaldir // Ama sadece bizim tanımladığımız Meyve için doğru olabilir Meyve sonucu = p1.get ();Genişletilmiş tipin rolü nedir?
Bu sınıfla uyumluluğu belirtmek için süper tarafından değiştirilmiş uyumlu bir araç olarak düşünebilirsiniz ve bu şekilde, yukarıda bahsedilen Ana listedeki verileri depolamak için daha uygundur. Bu, sık eklemeler için uygun bir çözümdür.
// Yiyecek konumunu doldurun, seviye Meyveye eşit veya daha büyük olmalıdır Tabak < ? süper Meyve > p1 = yeni Plaka < Gıda > (yeni Apple ()); // Extend'lerden farklı olarak depolanabilir p1.set (yeni Muz ()); // yöntemi al Muz sonucu1 = p1.get (); // bir hata bildirecek, dönüş yalnızca bir Nesne olduğu için zorunlu dönüştürmeye tabi tutulmalıdır Object result2 = p1.get (); // Bir Object verisi döndürmek için, tüm verileri kaybetmek üzereyiz, bu yüzden okumak için uygun değilYukarıdakiler öğrendiklerimin sonuçlarıdır.Düşünmediğim bir şey varsa veya makalede hatalar varsa lütfen benimle paylaşın.
Son olarak şunu söylemek istiyorum: Programcılar için öğrenilmesi gereken çok fazla bilgi içeriği ve teknoloji var. Çevre tarafından ortadan kaldırılmak istemiyorsanız, kendinizi sürekli geliştirmelisiniz. Bize uyum sağlamak için çevreye değil, her zaman çevreye uyum sağlıyoruz!
Burada editör, yukarıdaki teknik sistem şemalarıyla ilgili düzinelerce set koleksiyonunu paylaşacaktır. Tencent, Toutiao, Ali, Meituan ve diğer şirketlerden 19 yıl içinde mülakat soruları , Teknik noktaları video ve PDF olarak düzenledi (aslında beklenenden çok daha fazla enerji harcadı), Bilgi bağlamı + birçok ayrıntı , Sınırlı alan nedeniyle, işte resim şeklinde bir parçası.
ve ayrıca Gelişmiş mimari teknolojisi gelişmiş zihin haritası, Android geliştirme röportajı özel materyalleri , Herkesin ileri seviyeyi geliştirmeyi öğrenmesine yardımcı olmak için gelişmiş gelişmiş çerçeve materyalleri ve ayrıca internette öğrenmek için materyal aramak için herkesin zamanından tasarruf sağlar ve ayrıca birlikte öğrenmek için arkadaşlarla paylaşılabilir.
Size birçok kazanç getireceğine inanıyorum:
[Android gelişmiş öğrenme videosu], [Android mülakat hilelerinin tam seti PDF], [Android geliştirme temel bilgi notları] özel mesajla [Android] ücretsiz olarak elde edilebilir!
Programcı olmak kolaydır. İyi bir programcı olmak sürekli öğrenmeyi gerektirir. Genç programcıdan kıdemli programcıya, küçük mimardan kıdemli mimara veya yönetime, teknik müdürden teknik direktörlüğe kadar her aşamada Farklı yeteneklere hakim olmanız gerekiyor. İşinizde ve yetenek gelişiminizde akranlarınızdan kurtulmak için kariyer yönünüzü erkenden belirleyin.