簡體   English   中英

在從非泛型接口繼承的泛型類型中實現泛型方法的問題

[英]Problem implementing a generic method in a generic type which inherits from a non-generic interface

我有一個帶有兩個通用方法簽名的非通用接口。

interface IDataContainer
{
    T GetValue<T>();
    void SetValue<T>(T value);
}

然后我有一個實現 IDataContainer 的通用 class

public class DataContainer<T>: IDataContainer
{
    private T _value;

    #region IDataContainer Members

    public T GetValue<T>()
    {
        return _value;
    }

    public void SetValue<T>(T value)
    {
        _value = value;
    }

    #endregion
}

我收到一個關於無法在已實現的 GetValue 和 SetValue 方法上將類型 T 隱式轉換為 T 的錯誤。

有沒有辦法解決這個問題? 某種類型的平等約束? 有沒有更好的辦法?

我知道我可以通過將 IDataContainer 設為通用來使其成為通用IDataContainer<T> ,但是當 T 並不總是相同類型時,我無法擁有 IDataContainers 列表。

您的問題是編譯器看到兩種不同的類型。 IDataContainer 的 scope 中的 T 與通用方法的 scope 中的 T 不同,因此編譯器會抱怨。

因為您的容器包含 T 的實例,所以我認為您的接口也應該具有類型參數 T(而不僅僅是方法范圍的泛型參數)。

您當前的接口實際上承諾(請記住,接口是合同),能夠為任何 T 提供 T 值 - 這肯定不是您想要的嗎?

您的代碼的意圖將在通用接口中很好地捕獲:

interface IDataContainer<T> {
  T GetValue();
  void SetValue(T value);
}

那么為什么你有一個帶有泛型方法的非泛型接口呢?

泛型方法的問題在於類型參數不相同,盡管它們具有相同的名稱。

要在 T 不相同時獲得數據容器列表,只需為您的通用接口提供一個非通用基本接口:

interface IDataContainer { }

interface IDataContainer<T> : IDataContainer { 
  ...
}

然后你可以有一個非通用數據容器的列表。

這兩種方法意味着兩種不同的東西。 在 IDataContainer 中,您指定一個泛型方法。 這可以用任何類型調用。 DataContainer中,您指定采用 class 中指定的特定類型參數的方法。 DataContainer不滿足IDataContainer的合同。 您應該更改IDataContainer以使其具有通用性。

為了更清楚,請單獨考慮IDataContainer 無論getContainer()返回的具體容器如何,以下代碼都應該是合法的

IDataContainer ctr = getContainer();
String x = ctr.getValue<String>();

但是,如果 getContainer 如下所示,那么如果您擁有的是合法的,那么該代碼顯然會中斷:

public IDataContainer getContainer() {
    return new DataContainer<Foo>();
}

您遇到的根本問題是,如果您有不同類型的 DataContainers,那么這些 DataContainers 的合同就根本不同。 DataContainer<Foo>有一個GetValue給你一個Foo ,而DataContainer<Bar>有一個GetValue給你一個Bar 如果 Foo 和 Bar 都有一個超類,那么您可以使用它,否則,您將進行強制轉換,因為如果將它們一起放入列表中,您根本無法保證類型安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM