, neden Groovy yönteminde barMany
içinde kapatma parametresinin verilen genel tür deklarasyon görmezden gibi görünüyor: 2.4.5 JVM: 1.7.0_80 Satıcı: Oracle Corporation OS: LinuxKapatma parametre anomali Aşağıdaki kodda
Yani önce farkında değil bu garip hata vardı Güncelleme - org .codehaus.groovy.control.MultipleCompilationErrorsException: Başlangıç başarısız oldu - Tam çıkış göndeririz:
~/grov/tests$ groovyc generics.groovy
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
generics.groovy: 27: Expected parameter of type java.lang.Object but got T
@ line 27, column 19.
items.each { T item -> barOne(item) } // Error:
^
generics.groovy: 27: [Static type checking] - Cannot find matching method Bar#barOne(java.lang.Object). Please check if the declared type is right and if the method exists.
@ line 27, column 29.
items.each { T item -> barOne(item) } // Error:
^
generics.groovy: 30: Expected parameter of type java.lang.Object but got T
@ line 30, column 22.
items.each { T item -> barOne(item as T) } // Error:
^
3 errors
~/grov/tests$ groovyc -v
Groovy compiler version 2.4.5
Copyright 2003-2015 The Apache Software Foundation. http://groovy-lang.org/
Güncelleme şeyiyle
Biraz daha geçici çözümler: Bu çözümler çalışmıyor gibi görünüyor:
Closure c = { T item -> barOne(item) }; items.each c // See comments by @tim_yates
items.each ({ T item -> barOne(item) } as Closure) // Casting to closure works too!
Aynı sorun, bir tür genel T:
tabanlı bir sınıf olduğunda da geçerlidir.@CompileStatic
class Baz<T extends Baz<T>> {
List<T> getList() {
return [new T(), new T()]
}
}
@CompileStatic
class BazClient {
void useBaz(Baz baz) {
// baz.getList().each {Baz it -> println it} // Error
Closure c = {Baz it -> println it}; baz.getList().each c // works
baz.getList().each ({Baz it -> println it} as Closure) // works
}
}
Hangi sürümü groovy? –
Güncelleme - özür dilerim. –
Bu kodla ilgili bir sorunum yok, IDE'yi yeniden başlatmayı deneyin. Neden hata dediği hakkında bir fikrim yok. – Fincio