Bu hat derleme yapmaz. Nesnelerin ve Class<E2>
, Class<Example>
değil, çünkü Example
çıkarımı olamaz. Java jeneriklerinin değişmezliği bunun olmasını engeller.
Sen test
'ın genel tür parametre üzerinde bir üst sınır joker tanıtarak bu çalışabilirsiniz:
public static <E extends Example> void test(Class<? extends E>... es)
Bu E1
ve E2
ile üst sınır joker karşılayarak, Java E
için Example
anlaması için izin verir.
İkinci satır, bir Class
es esası oluşturarak, jenerikleri atlayarak ve "denetlenmeyen arama" uyarısı üreterek oluşturur. Burada Class
bir tür bağımsız değişkeni sağlamak girişimi olsaydı
new Class[]{E1.class,E2.class}
, herhangi yarı yolda makul tipi parametresi olan bir derleyici hatası alacağı:
// Needs Class<Example> but found Class<E1> and Class<E2>
test(new Class<Example>[]{E1.class,E2.class});
// Needs Class<E1> but found Class<E2>
test(new Class<E1>[]{E1.class,E2.class});
// Needs Class<E2> but found Class<E1>
test(new Class<E2>[]{E1.class,E2.class});
bir joker kullanılarak girişimin karşılanması Burada sadece gerçek problemi ortaya çıkar - genel dizi oluşturma.
// Generic array creation
test(new Class<? extends Example>[]{E1.class,E2.class});
Çok teşekkürler. Programım için hiçbir zaman zararlı değildi, ama kesinlikle bir süredir başımı kaşımıyordum. Açıklamayı gerçekten takdir ediyorum. – Squirvin