C# 在C中创建类型实例

C# 在C中创建类型实例,c#,.net,generics,C#,.net,Generics,如果我们将类的参数化构造函数声明为: public KeyCountMap(Class<? extends Map> _mapType) { _map = _mapType.newInstance(); } 而不是 private Map<T, MutableInt> _map = new LinkedHashMap<T, MutableInt>(); 编辑 考虑的实际Java构造函数是: @SuppressWarnings({ "unche

如果我们将类的参数化构造函数声明为:

public KeyCountMap(Class<? extends Map> _mapType)
{
   _map = _mapType.newInstance();
}  
而不是

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中创建类类型的对象的新实例

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。字典和映射的创建不相等映射[invlaidkey]=null,字典[invalidkey]=exception

编辑


第二个示例满足编辑部分。但是,在您的示例中,它并不完全等同于您从c中的类型构造实例,这可以通过使用Activator.CreateInstance来实现。然而,在c中,如果不编写传入的类型的反射,就无法进行约束。即使如此,这也是一个运行时约束,而不是编译时约束。因此,我建议在大多数情况下使用泛型;除非您特别需要在运行时实例化尚未表达的未知类型。

这是一个Java问题,可能是重复的吗?@Chris您建议的重复问题是关于无参数构造函数,而这里是一个参数化的构造函数。那又怎样?@Underbalanced它与Java和C都有关系well@Taufel这在中与Java无关,因为您只需要询问C泛型和通配符@Mark,您在这个答案中初始化了_map,那么Class@Mark-我们将如何适应这里的C类型,它有什么用途吗?我想通过使用_map=newdictionary;我们实际上正在创建一个新实例。FineType在我的例子中是T,是的,你可以简单地更新它,我会用更多的例子更新我的答案。是的,我也将我的类声明为KeyCountMap,但只是混淆了,你的建议答案将覆盖我的编辑中给出的构造函数
@SuppressWarnings({ "unchecked", "rawtypes" })
public KeyCountMap(Class<? extends Map> _mapType) throws InstantiationException, IllegalAccessException 
{
    _map = _mapType.newInstance();
}
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();
        }
    }