C#中的Java泛型

本文关键字:泛型 Java 中的 | 更新日期: 2024-10-18 22:49:51

嗨,我是C#泛型的新手,用C#重写以下代码的正确方法是什么?

public class A <T extends Base>{
    Map<Class<T>,Object> m = newHashMap();
}

C#中的Java泛型

最后,我想我完全理解了你的意图。

public class A<T> where T : Base
{
    Dictionary<Type, T> m = new Dictionary<Type, T>();
}

C#中没有类型擦除,所以您将不得不更改一些代码。

正如在其他帖子中所说,class A<T extends Base>的C#等价物是class A<T> where T : Base。但与java.lang.Class不同,C#类System.Type不是泛型的,因此C#中没有等价的Class<? extends Base>概念。您的选项减少为:

public class A<T> where T : Base
{
    Dictionary<Type, object> m = new Dictionary<Type, object>();
}

现在你可能有:

public class Sub1 : Base {}
public class Sub2 : Base {}
....
m.Add(typeof(Sub1), new object());
m.Add(typeof(Sub2), new object());

但不幸的是:

m.Add(typeof(string), new object());

您最好的选择是确保m被适当封装,这样就不会发生这种情况。

您可以使用约束来实现这一点,如下所述:http://msdn.microsoft.com/en-us/library/d5x73970

public class A<T>
  where T : Base
{
}

使用类型约束,如下所示:

public class A<T> where T : Base {
}