繁体   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