2013-08-06 69 views
0

我正在開發一個Android應用程序,我正在使用泛型的一部分。不過,我收到了一個我無法理解的編譯器錯誤。Android泛型錯誤:該方法不適用於參數

我有以下結構:

public interface IMakeableEncryptionBundle<T, F> { 
    public void setConfigurationFactory(F configurationFactory); 
} 

public class VigEncryptionBundle 
    implements IMakeableEncryptionBundle<ITextContent, VigConfigurationFactory> { 
    @Override 
    public void setConfigurationFactory(VigConfigurationFactory configFactory) { 
    // Set the factory. 
    } 
} 


public interface IConfigurationFactory { } 

public final class VigConfigurationFactory implements IConfigurationFactory { } 

我用它是這樣的:

private IMakeableEncryptionBundle< 
    ITextContent, 
    ? extends IConfigurationFactory> encryptionBundle 
    = new VigEncryptionBundle(); 

這是什麼原因造成的錯誤:

VigConfigurationFactory configFactory = (VigConfigurationFactory) configObj; 
encryptionBundle.setConfigurationFactory(configFactory); 

「的方法setConfigurationFactory(capture#8-of?擴展IConfigurationFactory)的類型IMakeabl eEncryptionBundle不適用於參數(VigConfigurationFactory)「

但是這不正是」擴展「應該做什麼嗎?允許你使用子類/實現嗎?

而且這也不是工作:

encryptionBundle.setConfigurationFactory((IConfigurationFactory) configFactory); 



編輯: 我試圖實現的,是有特定IConfiguration實現的獨立性和放encryptionBundle的實例在外部類。

同時我需要泛型來確保特定的IMakeableEncryptionBundle實現可以使用它自己的IConfiguration實現。

此外,根據下述建議給了我另一個錯誤:

private IMakeableEncryptionBundle< 
    ITextContent, 
    IConfigurationFactory> encryptionBundle 
    = new VigEncryptionBundle(); 

「類型不匹配:不能從VigEncryptionBundle轉換爲IMakeableEncryptionBundle」


我甚至想聲明以下沒有變化:

public interface IMakeableEncryptionBundle<T, F extends IConfigurationFactory> 
+0

我不明白你在編輯代碼時如何獨立於特定的實現並將'encryptionBundle'實例化到另一個類中。無論哪條線實例化encryptionBundle將取決於實現。你的意思是,你想用'VigConfigurationFactory'在一個類中創建一個'IMakeableEncryptionBundle',然後將它提供給另一個不知道該特定工廠的類嗎? – jacobm

+0

確切地說,我使用'encryptionBundle'的類不應該瞭解特定的工廠。實例化它的將是外部類。這就是爲什麼我不能在這裏使用'VigConfigurationFactory'。 – Aseru

+0

你實際上是否需要'F'類型的參數?爲什麼不刪除它,並用'IMakeableEncryptionBundle '在setConfigurationFactory的簽名中替換它的實例? – jacobm

回答

1

我能得到你的代碼通過改變

private IMakeableEncryptionBundle<ITextContent, ? extends IConfigurationFactory> encryptionBundle = new VigEncryptionBundle(); 

合作,

private IMakeableEncryptionBundle<ITextContent, IConfigurationFactory> encryptionBundle = new VigEncryptionBundle(); 

我也不太清楚它背後的原因,但我認爲它是與IConfigurationFactory是一個接口的事實。

+0

這不適合我。我收到一個類型錯誤(請參閱編輯)。你修改了'VigEncryptionBundle'類嗎? – Aseru

+0

我會在上面添加這條評論,但我沒有代表:( 與@ jacobm的評論一致,通過將接口聲明更改爲,看起來好像您始終期待F通用類型你可以在這裏做以下兩件事之一來處理你想要做的事情:除去F泛型參數並讓setConfigurationFactory接受IConfigurationFactory的參數,或者你可以改變VigEncryptionBundle的聲明來實現IMakeableEncryptionBundle merfanzo

+0

問題是我不需要F是IConfigurationFactory,而是它的一個特定的實現。我試圖確保'VigEncryptionBundle'中的'setConfigurationFactory'只能帶'VigConfigurationFactory'。將它改爲'',我不明白爲什麼它不符合ept'setConfigurationFactory(VigConfigurationFactory)'現在。 – Aseru

2

類型? extends IConfigurationFactoryencryptionBundle意味着「某種類型的,你不知道,擴展IConfigurationFactory(該變量encryptionBundle被分配到,可以給定一個更精確的類型的值就是無關;類型檢查忘記它在檢查分配是否有效之後。)

所以,當你嘗試調用setConfigurationFactoryVigConfigurationFactory,類型檢查理所當然地拒絕它:你只知道,在setConfigurationFactory的參數類型顯示了F是延伸IConfigurationFactory,而不是它的一些類特別是VigConfigurationFactory

你如何解決這個問題取決於你爲什麼要首先聲明encryptionFactory這種類型。如果可行,那麼只需將? extends IConfigurationFactory更改爲VigConfigurationFactory即可。否則,你如何解決問題將取決於你以後的樣子。

+0

因此,根據我的理解,「擴展」僅適用於這一行(聲明),確保使用的實例處於正確的類型。 但是如何修改代碼來實現我所需要的? (請參閱編輯)我無法使用您建議的方法,因爲這會導致來自'VigConfigurationFactory'的依賴項。我已經嘗試了幾乎所有的東西,但我沒有看到如何利用泛型以這種方式工作。 – Aseru

相關問題