OracleDocGenericMethod'dan jenerik yöntemler hakkında okuyorum . Joker karakterin ne zaman ve genel yöntemlerin ne zaman kullanılacağını söylediği zaman karşılaştırma konusunda kafam oldukça karışık. Belgeden alıntı yapmak.
interface Collection<E> { public boolean containsAll(Collection<?> c); public boolean addAll(Collection<? extends E> c); }
Bunun yerine burada genel yöntemler kullanabilirdik:
interface Collection<E> { public <T> boolean containsAll(Collection<T> c); public <T extends E> boolean addAll(Collection<T> c); // Hey, type variables can have bounds too! }
[…] Bu bize tür bağımsız değişkeninin polimorfizm için kullanıldığını gösterir; tek etkisi, çeşitli gerçek argüman türlerinin farklı çağrı sitelerinde kullanılmasına izin vermektir. Eğer durum buysa, joker karakterler kullanılmalıdır. Joker karakterler, burada ifade etmeye çalıştığımız şey olan esnek alt türlemeyi desteklemek için tasarlanmıştır.
Joker karakterin (Collection<? extends E> c);
de bir tür polimorfizmi desteklediğini düşünmüyor muyuz ? Öyleyse neden jenerik yöntem kullanımı bunda iyi değil?
Devam ediyor, diyor ki,
Genel yöntemler, tür parametrelerinin bir veya daha fazla argümanın türleri arasında bir yönteme ve / veya dönüş türüne bağımlılıkları ifade etmek için kullanılmasına izin verir. Böyle bir bağımlılık yoksa jenerik bir yöntem kullanılmamalıdır.
Ne anlama geliyor?
Örneği sundular
class Collections { public static <T> void copy(List<T> dest, List<? extends T> src) { ... }
[...]
Bu yöntem için imzayı joker karakter kullanmadan başka bir şekilde yazabilirdik:
class Collections { public static <T, S extends T> void copy(List<T> dest, List<S> src) { ... }
Belge, ikinci bildirimi caydırıyor ve ilk sözdiziminin kullanımını teşvik ediyor mu? Birinci ve ikinci beyan arasındaki fark nedir? İkisi de aynı şeyi yapıyor gibi görünüyor?
Birisi bu alana ışık tutabilir mi?
?
. Bunu `public static <T1 extends Number, T2 extends Number> void copy (List <T1> dest, List <T2> src) olarak yeniden yazabilirsiniz ve bu durumda neler olduğu açık hale gelir.