【问题标题】:Question about generics in C# comparing to Java关于 C# 中的泛型与 Java 比较的问题
【发布时间】:2011-05-12 15:13:22
【问题描述】:

在 Java 中,我可以使用通配符“?”指定泛型。可以创建这样的地图:

Map<String, ?>.

我正在使用 C#,我需要一个 Dictionary<String, SomeInterface<?>>(其中 ? 可以是 int、double 或任何类型)。这在 C# 中可行吗?

编辑:

例子:

interface ISomeInterface<out T>{
 T Method();
 void methodII();
}

class ObjectI : ISomeInterface<int>{
    ...
}
class ObjectII : ISomeInterface<double>{
    ...
}
class ObjectIII : ISomeInterface<string>{
    ....
}

我试图将这些对象映射到字典中,例如:

Dictionary<String, ISomeInterface<?>> _objs = new Dictionary<String, ISomeInterface<?>();

_objs.Add("Object1", new ObjectI());
_objs.Add("Object2", new ObjectII());
_objs.Add("Object3", new ObjectII());

foreach(var keyVal in _objs){
   Console.WriteLine(keyVal.Method());
}

实现 ISomeInterface 的对象在运行时使用 Assembly 和 Activator.createInstance 加载。在创建的那一刻,如果对象实现 ISomeInterface&lt;int&gt;ISomeInterface&lt;double&gt;,我不会。

非常感谢任何帮助。

【问题讨论】:

  • 我不太懂Java,但?不会和Object一样吗?
  • 是的,?Object。更出乎意料的是,你在里面写的anything居然是Object,因为Java的VM实际上并不支持泛型,所以它们在编译时都会被抹掉。

标签: c# java .net generics covariance


【解决方案1】:

没有。

但是,如果您使用的是 C# 4,则可以将 ISomeInterface covariant 设为 ISomeInterface&lt;Anything&gt; 将转换为 ISomeInterface&lt;object&gt;

如果ISomeInterface 的方法采用其类型参数的参数(而不是返回值),这将是完全不可能的,因为它允许您将任意对象作为参数传递。

编辑:在您的具体情况下,最好的解决方案是让IMyInterface&lt;T&gt; 继承一个单独的非泛型IMyInterface 接口,并将所有不涉及T 的成员移动到基本接口。
然后你可以使用Dictionary&lt;string, IMyInterface&gt;,你不会有任何麻烦。

【讨论】:

    【解决方案2】:

    可以将类型变量限制为某些类型:

    public class Map<U, T> where T : IInterface
    {
    }
    

    但是,你不能这样做:

    Map<string, T> map = new Map<string, T>()
    

    【讨论】:

      【解决方案3】:

      对于您所描述的用法,您可以使用解决方法,使用IDictionary&lt;string, ISomeInterface&gt;

      interface ISomeInterface
      {
          object Method();
          void Method2();
      }
      
      interface ISomeInterface<T> : ISomeInterface
      {
          T Method();
      }
      
      class C1 : ISomeInterface<int>
      {
          object ISomeInterface.Method() { return Method(); }
          public int Method() { return 10; }
          public void Method2() { }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 1970-01-01
        • 2010-11-03
        • 2023-01-18
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 2011-04-28
        相关资源
        最近更新 更多