Motivasyon (geriye dönük uyumluluk) hem bir avantaj hem de dezavantajdır. Dezavantajdır çünkü hepimiz yeniden kullanılabilir tiplere sahip olmayı tercih ederiz, ancak ödeme fiyatı yüksekti. C # 'daki tasarım seçeneklerini düşünün. Yeniden kullanılabilir türleri var, ancak şimdi yinelenen API'leri var. Bu nedenle, her parametreli sınıf için yinelenen API'lere sahip olduğumuz bir Java API'sini hayal edin. Şimdi, kendinizi eski sınıflardan yeni genel sınıflara binlerce kod satırı taşıdığınızı hayal edin. Şimdi, kim yinelenen API'leri bir dezavantaj olarak görmez ki? Ama hey, yeniden kullanılabilir türleri var!
Yani, temel motivasyon "devrim değil evrim" idi. Ve mantıklı olarak, her kararın ödünleşimi vardır.
Bahsedilen diğer dezavantajların yanı sıra, tür silme işleminin derleme zamanında akıl yürütmenin zor olabileceği gerçeğini de ekleyebiliriz, çünkü belirli türlerin kaldırılacağı açık değildir ve bu çok garip ve bulmak zor hatalara yol açar.
Köprü yöntemlerinin (ikili uyumluluğu korumak için sözdizimsel olarak üretilen bu yöntemler) varlığı dezavantaj olarak görülebilir. Bunlar, bir önceki paragrafta bahsettiğim hataların nedenlerinden biri olabilir.
Büyük dezavantajlar, genel tipler için birden fazla sınıf değil, tek bir sınıfın olduğu zaten açık olan gerçeğinden kaynaklanmaktadır. Başka bir örnek olarak, aynı genel sınıfa sahip bir yöntemin aşırı yüklenmesinin Java'da başarısız olduğunu düşünün:
public void doSomething(List<One>);
public void doSomething(List<Two>);
Yeniden kullanılabilir türlerin (en azından C # 'de) dezavantajı olarak görülebilecek bir şey, kod patlamasına neden olmalarıdır . Mesela List<int>bir sınıftır ve List<double>bu gibi başka tamamen farklı List<string>bir List<MyType>. Bu nedenle sınıflar çalışma zamanında tanımlanmalı, sınıfların patlamasına ve üretilirken değerli kaynakların tüketilmesine neden olmalıdır.
new T()Başka bir cevapta bahsedilen Java'da bir tanımlamanın mümkün olmadığı gerçeği ile ilgili olarak , bunun sadece tür silme meselesi olmadığını düşünmek de ilginçtir. Ayrıca, varsayılan bir kurucunun varlığını gerektirir, bu nedenle C # bunun için "yeni bir kısıtlama" gerektirir. (Bkz . Java'da neden yeni T () mümkün değil , Alex Buckley).
TsClass<T>için, tümTs için kodun yalnızca bir kopyasını almak söyleyerek doğru olduğunu düşünüyorum ; artı gerçekte kullanılan her bir değer türü için ek bir kopyaT.