与Java一样,如果我们将类的参数化构造函数声明为:
public KeyCountMap(Class<? extends Map> _mapType)
{
_map = _mapType.newInstance();
}
其中_map定义为:
private Map<T, MutableInt> _map = new LinkedHashMap<T, MutableInt>();
在C#中,我们将使用as:
Type
代替Class<? extends Map>
private Dictionary<T, MutableInt> _map = new Dictionary<T, MutableInt>();
而不是
private Map<T, MutableInt> _map = new LinkedHashMap<T, MutableInt>();
修改
考虑的实际Java构造函数是:
@SuppressWarnings({ "unchecked", "rawtypes" })
public KeyCountMap(Class<? extends Map> _mapType) throws InstantiationException, IllegalAccessException
{
_map = _mapType.newInstance();
}
由于C#中没有类似newInstance()
的方法,我不确定Activator.CreateInstance()
究竟是做什么的。
我们如何在使用java时在C#中创建类Type
的对象的新实例?
答案 0 :(得分:0)
public class KeyCountMap<T>
{
private readonly IDictionary<T,MutableInt> _map;
public KeyCountMap(){
_map = new Dictionary<T,MutableInt>();
}
}
public class KeyCountMap<T> where T: IDictionary<T, MutableInt>, new()
{
private readonly T _map;
public KeyCountMap()
{
_map = new T();
}
}
还记得java中的map是c#中的接口IDictionary。字典和地图不是等于Map [invlaidkey] = null,Dictionary [invalidkey] = exception
修改强>
第二个示例满足 EDIT 部分。但是,在您的示例中,您可以通过使用Activator.CreateInstance()来实现从c#中构造实例的实例。但是在c#中你没有办法约束(没有写一些反射)传入的类型。即使这样,这也是运行时约束而不是编译时间。所以我建议大部分都使用泛型;除非您特别需要在运行时实例化尚未表达的未知类型。