2014-04-18 69 views
3

我剛剛在不知不覺中走進了一個泛型漏洞,並擊中了Dagger對象圖形驗證錯誤(我認爲這是dagger-compile驗證,但沒有生成具體的錯誤消息 - 只是maven的漂亮的BUILD FAILURE消息)。我正在嘗試注入通配符類型的實現。爲了更好地理解我創建的問題,我有點不知所措,因此這裏是代碼;用匕首注入通配符

@Inject Provider<MarkerOption<?>> markerOptionProvider; 

模塊定義爲;

@Provides MarkerOptions<?> provideMarkerOptions() { 
    MarkerOptions<?> options; 
    if (ConnectionResult.SUCCESS == GooglePlayServicesUtil.isGooglePlayServicesAvailable(context)) { 
     // This is the Google maps MarkerOption impl 
     options = new GoogleMapMarkerOptions(new com.google.android.gms.maps.model.MarkerOptions()); 
    } else { 
     // This is the osmdroid impl of MarkerOptions 
     options = new OsmDroidMarkerOptions(); 
    } 

    return options; 
    } 

我猜這裏的代碼味道是提供注射,但我有興趣更好地瞭解匕首編譯跑去試圖解決的執行情況時進入的問題。值得注意的是,刪除通配符通用<?>允許Dagger計算應用程序運行所需的對象圖。我希望MarkerOptions提供者的注入可以利用模塊MarkerOptions綁定,而不管接口類型如何。

如果有人能向我解釋什麼地方出了問題/爲什麼我不應該得到這麼多,那麼將非常感激。

回答

2

Dagger目前不支持注入中的通配符類型。您需要注入具體類型或原始類型(如您所見)。

理論上可以支持簡單的通配符,只要提供的是Foo<?>,注入的內容是Foo<?> - 匹配部分會被禁止。

+0

感謝您對Christian的快速反應。我很喜歡用這個小項目的原始類型 - 沒有獎品來猜測我在做什麼(!)你能想到這種使用通配符會有好處的場景嗎?也許是通配符? – OceanLife