Java-8'de yöntem referansı ve jenerikler


11

Genel türlerle birlikte yöntem başvurusu ile ilgili sorun yaşıyorum .

Aşırı yüklenmiş bir yöntemi çağırmamız gereken kodumuz var, ancak hata ile başarısız oluyor:

M1 değeri çözümlenemiyor ()

Sorunun nerede yattığını netleştirmek için sorunumu basitleştirdim.

Aşağıdaki kod başarısız olur:

public class Test {
    void test() {
        // Getting error here
        setValue(C1::m1, Integer.ONE);
    }

    <E extends I1, T> void setValue(BiConsumer<E, T> cons, T value) {
    }
}

interface I1 {
}

class C1 implements I1 {
    void m1(Integer value) {
    }

    void m1(int value) {
    }
}

Birisi bunun neden böyle davrandığını memnun edebilir mi?

Lütfen bunun genel türlerle Java 8 Yöntemi başvurusu sorusuyla ilgili olmadığını unutmayın.


hayır yöntemlerden birini kaldırırsanız o zaman iyi çalışıyor
Joker

Bu soruyu tekrar açtığınız için teşekkürler ... :)
Joker

Yanıtlar:


7

Tip akıl yürütme kuralları doğru çekme arasındaki çatışmayı çözmek için "akıllı" yeterli olmadığını görünüyor m1doğru çıkarımlara tür parametreleri varyantı ve üretme setValueçağrısı ( Bve BigDecimalsırasıyla).

Bunun neden başarısız olduğunu tam olarak açıklayamıyorum , ancak tip çıkarım geleneksel olarak gizemli, mantıklı ve sezgisel olmayan bir alan oldu, bu yüzden çok şaşırmıyorum.

setValueDerleyicinin doğru m1yöntemi seçeceği noktaya bir tanık ekleyerek (hangi tip parametrelerini çağırmak istediğinizi belirterek) ekleyerek bu soruna geçici bir çözüm bulabilirsiniz :

this.<B,BigDecimal>setValue(B::m1, BigDecimal.ONE);

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.