İle ilgili sorun
List<String> list = new LinkedList();
sol tarafta , sağdaki ham türü kullandığınız genel türü List<String>
kullanmanızdır . Java'daki ham türler yalnızca pre-generics koduyla uyumluluk için etkili bir şekilde bulunur ve kesinlikle gerekmedikçe asla yeni kodlarda kullanılmamalıdır.LinkedList
Şimdi, Java başından beri jeneriklere sahipse ve LinkedList
orijinal olarak jeneriklere sahip olmadan önce oluşturulmuş gibi türlere sahip değilse , muhtemelen genel bir tür için yapıcı otomatik olarak soldan tür parametrelerini ihlal edebilirdi - mümkünse ödevin tarafı. Ancak olmadı ve geriye dönük uyumluluk için ham türleri ve genel türleri farklı şekilde ele almalıdır. Bu onların tür parametrelerini tekrarlamak zorunda kalmadan genel bir nesnenin yeni bir örneğini ... elmas operatörünü bildirmek için biraz farklı , ama aynı derecede kullanışlı bir yol yapma ihtiyacı bırakıyor .
Orijinal örneğinize göre List<String> list = new LinkedList()
, derleyici bu ödev için bir uyarı oluşturur çünkü zorunludur. Bunu düşün:
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
Jenerikler, yanlış şeyi yapmaya karşı derleme zamanı koruması sağlamak için mevcuttur. Yukarıdaki örnekte, raw türünü kullanmak, bu korumayı alamayacağınız ve çalışma zamanında bir hata alacağınız anlamına gelir. Bu yüzden ham türleri kullanmamalısınız.
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
Bununla birlikte, elmas operatörü, atamanın sağ tarafının, bu parametreleri tekrar yazmak zorunda kalmadan, sol tarafla aynı tip parametrelerine sahip gerçek bir genel örnek olarak tanımlanmasını sağlar. Ham tipi kullanmakla neredeyse aynı çabayla jeneriklerin güvenliğini korumanıza izin verir .
Bence anlaşılması gereken en önemli şey, ham türlerin (no ile <>
) genel türlerle aynı şekilde ele alınamayacağıdır. Ham bir tür bildirdiğinizde, jeneriklerin hiçbir faydası ve tür kontrolünü elde edemezsiniz. Ayrıca, jeneriklerin Java dilinin genel amaçlı bir parçası olduğunu da aklınızda bulundurmanız gerekir ... onlar sadece Collection
s no-arg kurucuları için geçerli değildir !