1

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

public class A <T extends Base>{

    Map<Class<T>,Object> m = newHashMap();

}
4

4 回答 4

4

最后,我想我正确地理解了你的意图。

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

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

于 2012-08-05T11:53:33.813 回答
1

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

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被适当地封装,这样就不会发生这种情况。

于 2012-08-05T13:06:01.327 回答
0

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

public class A<T>
  where T : Base
{
}
于 2012-08-05T11:53:12.207 回答
0

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

public class A<T> where T : Base {

}
于 2012-08-05T11:53:51.867 回答