2016-04-11 34 views
0

Groovy'un statik typechecker ile oynuyorum ve ilginç bir sorunla karşılaştım. Java yöntemini çağıran Groovy yöntemim var. Groovy tarafta, bu kod iyi çalışır, ben typechecking olmadan Groovy: yöntem uygulanamaz (yakalama <?>)

public static Map<String, String> page2map(Page page) { 
    Map<String, String> res = new HashMap<>(); 
    res.put("likes", page.getName()); 
    // some more stuff here 
    return res; 
} 

var, Java tarafında
import com.restfb.Parameter 
import com.restfb.Connection 
import com.restfb.Version 
import com.restfb.DefaultFacebookClient 

@TypeChecked 
static List<Map<String, String>> getPages(accessToken, query) { 
    Connection<Page> conn = new DefaultFacebookClient(accessToken, Version.VERSION_2_5).fetchConnection(
      "search", Page.class, 
      Parameter.with("q", query), 
      Parameter.with("type", "page"), 
      Parameter.with("fields", "name,about"), 
      Parameter.with("limit", 100) 
    ); 

    conn.data.flatten().collect { p -> page2map(p) } // error here 
} 

var. Typechecking ile Groovy kodunun son satırında method cannot be applied to (capture<?>) derleyici hatası alıyorum. Groovy 2.4.6 çalışıyorum. Baska öneri?

+0

P' tip explicitelty 'tanımlamak denemek anlamına gelebilir – injecteer

cevap

0

Groovy varsayılan olarak çok genel olduğunu varsayar ve varsayar. Bu, Java ile konuşmaya çalışırken beni rahatsız etti.

Ben flatten veya collect size ArrayList veya HashMap bir veriyor şüpheleniyoruz. Satır içi kapatma Object döndürüyor olabilir.

Eğer collect açıkça dönen ne belirterek olmadığından

, bunun bir ArrayList<Object> iade edilecektir ki beklemek gidiyorum ve inline-kapama imza Object f(Object x) olacaktır.

son derece açık olmak deneyin (kabaca) Aşağıdaki

Map<String, String> my_method(Page p) = { return page2map(p) } 
List<Map<String, String>> container; 
container = conn.data.flatten().collect(my_method) 
return container 

Ben de türleri dolanıyordu tam olarak ne olduğunu görmek için neler dair daha fazla bilgi edinmek için oluşturulan harika koçanları bakmak istiyorum. Eğer türleri ile uğraşmak zorunda değil, ayrıca @TypeChecked kullanılmasına karşı düşünebiliriz TheClass$getPages$Inline$Closure$1

çizgisinde bir şey görünecektir kullandığınız kapatma ilk etapta Groovy kullanmanın bir avantajdır. `- {> ... Sayfa p}` .Yaðlar:

Ayrıca

, sen ClassName.page2map yerine page2map

İlgili konular