是否可以在Java或C#中实例化泛型类型的对象?

是否可以在Java或C#中实例化泛型类型的对象?,c#,java,generics,C#,Java,Generics,例如,在Java中,如果我有一个参数化类,是否可以执行以下操作 public class MyClass<T>{ public void aMethod { .. T object = new T(); .. } .. } 公共类MyClass{ 公共空间法{ .. T对象=新的T(); .. } .. } 在Java中,我认为这是不可能的,因为编译器不知道调用什么构造函数。但是在C#中呢?我不懂语言,我读过很多黑暗的事情可以做,所以我只是想知

例如,在Java中,如果我有一个参数化类,是否可以执行以下操作

public class MyClass<T>{
  public void aMethod {
    ..
    T object = new T();
    ..
  }
  ..
}
公共类MyClass{
公共空间法{
..
T对象=新的T();
..
}
..
}

在Java中,我认为这是不可能的,因为编译器不知道调用什么构造函数。但是在C#中呢?我不懂语言,我读过很多黑暗的事情可以做,所以我只是想知道……是的,这是可能的。您可以使用
Activator.CreateInstance()

发件人:

Activator.CreateInstance(T)方法 创建该类型的实例 由指定的泛型指定 类型参数,使用 无参数构造函数

public class MyClass<T> where T:new(){
   public void aMethod {
   ..
   T object = new T();
   ..
   }
   ..

}
这在C#中是可能的,如果您将T类型上的约束设置为具有无参数构造函数

public class MyClass<T> where T:new(){
   public void aMethod {
   ..
   T object = new T();
   ..
   }
   ..

}
公共类MyClass,其中T:new(){
公共空间法{
..
T对象=新的T();
..
}
..
}
参见。

正如Donut所说,C允许您在运行时使用
Activator.CreateInstance
实例化任意类型,其工作原理有点像Java中的
Class.newInstance
。由于C#的泛型在编译后被保留,与Java不同,C#允许您为给定的类型参数获取
Type
实例,从而调用
CreateInstance
或任何其他构造函数

public class MyClass<T> where T:new(){
   public void aMethod {
   ..
   T object = new T();
   ..
   }
   ..

}
对于无参数构造函数,使用通用约束,这要容易得多:

void <T> T createT() where T : new()
{
    return new T();
}
在c#中,可以使用where关键字

private class MyClass<T> where T : new()
{
        private void AMethod()
        {
            T myVariable = new T();
        }
}
私有类MyClass,其中T:new()
{
私人空间法()
{
T myVariable=newt();
}
}

总而言之,在java中无法实例化泛型类型T。 在C#中,有几种方法


我理解正确吗?

您可以通过反射在Java中执行此操作:

public class Example {
    public static void main(String[] args) throws Exception {
        String s = create(String.class);
    }

    // Method that creates a new T
    public static <T> T create(Class<T> c) throws InstantiationException, IllegalAccessException {
        return c.newInstance();
    }
}
公共类示例{
公共静态void main(字符串[]args)引发异常{
String s=create(String.class);
}
//方法创建一个新的T
公共静态T create(类c)抛出实例化异常IllegaAccessException{
返回c.newInstance();
}
}

Java中一个不那么难看的变通方法:。

关于Java,你是对的。不过,还有一些棘手的解决办法,不是解决办法。您无法预先知道任意类型需要哪些参数。@开发者艺术:对不起,您的常识又让您失望了。没有人在任何地方谈论完全任意的类型。你总是需要做出某些假设,没有人否认这一点。像上面这样的代码是有效的,并且实际上被大量使用。这当然是许多问题的“解决方案”。如果这个方法不起作用,微软为什么还要提供它呢?@Konrad Rudolph:问题作者没有指定他只对具有无参数构造函数的类型感兴趣。@Developer Art:问题中的“
new t()
”怎么办?对类型施加限制不是一个通用的解决方案。是的,不是。但它提供了编译时检查,这在使用Activator时是不可能的。符合原海报的要求;)@开发者艺术:“泛型”在C#和Java中都有固定的含义。不要为了引起争议而随意地重新定义它。这个解决方案是通用的,period.No,在Java中也可以,尽管不使用
new T()。看看我的答案。