2016-04-12 34 views
2

Burada iki basit sınıf olan Dad ve Son'u oluşturuyorum, Son, Baba'nın bir alt sınıfıdır. SonraJava8: lambda işlevinde genel sürümlü derleyici hatası

public class Dad { 
} 

public class Son extends Dad { 
} 

Ben

public class Test { 
    public static void main(String[] args) { 
     Function<? extends Dad, String> fun = son -> son.toString(); 
     fun.apply(new Son()); 
} 

test etmek için diğer sınıftaki bir Function oluşturmak Ama fun.apply(new Son()) bir derleyici hatası karşılaştım, bu uygulamak 'diyor (işlev içinde captrue için appiled edilemez (Oğul) '. Kafam karıştı, funDad'u genişleten bir sınıf paramız gerekiyor, alt sınıfı veriyorum ama hiç doğru değil.

Dahası! Ben fun için param olarak new Dad() deneyin, ama aynı zamanda hata mesajı

Son olarak, ne zaman kullanılabileceği param bilmiyorum ' (işlev içinde captrue (baba) için appiled olamaz) uygulamak ' var jenerik versiyonu ile Function.

Yardım ~~~ Teşekkürler!

+0

Ne yapmaya çalıştığınızı açıklar mısınız? Eğer fonksiyonunuzun argümanının '' Babanı '' genişletdiğini biliyorsanız, neden '' Fonksiyon 'fonksiyonunu kullanamazsınız? Baba genişletir, String> '? – sprinter

+0

Tamam, öncelikle bir elemente sahibim. Bu ismin adı SON1 ve SON2, ve burada Son1 ve Son2 yedekleri, her ikisi de Baba'yı genişletiyor. Şimdi dışarıdan enum'un adını SON1 veya SON2 gibi param olarak aldım, Son1 veya Son2'yi veritabanından enum'un ismiyle sorgulamak istiyorum ve Son1'in veya name2'nin Son Adı'nın nickName değerini döndürmek için, her iki öznitelik de String'dir. Geçerli enum yargılamak için if bloğunu kullanmak istemiyorum, sadece enum'u ismiyle almak ve veritabanını enum ile sorgulamak istiyorum ve en – Tony

+0

numaralı enum'dan istediğim özniteliği almak istiyorum. Baba, String> enum, SON1 (Son1 son1 -> son1.getName()) öğesini genişletir. SON2 (Son2 son2 -> son2.getNickName()). Ama başvurduğumda, derlediğim gibi derleyici hatasını aldım. Lütfen bana yardım eder misiniz? ya da ben sadece şu bloğu kullanabilirdim: ( – Tony

cevap

2

aşağıdaki düşünün (⊙o⊙): derleyici bunu yapmanıza izin ederse

class Daughter extends Dad {} 

Function<Daughter, String> funcForDaughter = ...; 
Function<? extends Dad, String> fun = funcForDaughter; // ok 

fun.apply(new Son()); 

, sadece Daughter kabul eden bir yönteme bir Son geçen edilebilir. Aynı sebep, fun.apply(new Dad()) numaralı telefonu aramanızı da yasaklar.

Function<? extends Dad, String> fun, 'un Dad'un herhangi bir alt türünde çalıştığı anlamına gelmez. fun, Dad'un belirli bir alt türünde bu noktada bilinmediği anlamına gelir. fun bu şekilde ilan ederek

, bunu güvensiz null başka her şey fun.apply çağırmak ve böylece derleyici bunu yapmanıza izin vermez olun.

+0

Teşekkürler:) dediğin gibi, Fonksiyonu bu şekilde ifade edemiyorum 'Fonksiyon fun', belki de kodum için başka bir yol düşünmeliyim. – Tony

+0

@Tony: Mevcut olmayan bir sorunu çözmeye çalışıyorsunuz, bu da Jenerik ile ilgili konuları karmaşıklaştırıyor. Sadece İşlev 'kullanın. "Baba" örneklerini kabul edebilen bir işlev zaten "Oğul" da dahil olmak üzere alt sınıfların örneğini kabul etme yeteneğine sahiptir, eğer Oğul "Baba" nın bir alt sınıfıysa (oldukça tuhaf bir şey). Bu, Jenerik değil, her zaman gerekli türde bir alt sınıfın örneğini geçirebileceğiniz temel OOP'tur. – Holger

+0

@Holger: Cevabınız için teşekkürler, İşlev fun işlevini kullandığımda doğru, "Baba" alt sınıfını param olarak kabul edebilir, ancak alt sınıfla işlevi başlatamıyorum, neden jenerik kullanmak istiyorum sürüm, “Baba”, Son1 ve Son2'nin iki alt sınıfı olduğu için, Son1'in bir örneği olduğunda, Son1'in bir örneğini geldiğinde, Son1'in “isim”, “Son1 :: getName” gibi değer niteliğini almak istiyorum. Son2'nin 'nickName' değerini almak istiyorum, 'Son2 :: getNickName' gibi, (bir sonraki cevaba bakınız) – Tony

İlgili konular