[英]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.