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

时间:2009-10-16 14:10:16

标签: c# java generics

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

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

在Java中,我认为这是不可能的,因为编译器不知道要调用什么构造函数。但在C#?我不懂语言而且我读过很多黑暗的东西都可以做,所以我只是想知道..

7 个答案:

答案 0 :(得分:9)

如果要在T类型上设置约束以使其具有无参数构造函数,则可以在C#中使用。

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

}

请参阅here

答案 1 :(得分:6)

就像Donut所说的那样,C#允许你使用Activator.CreateInstance在运行时实例化任意类型,它在Java中有点像Class<?>.newInstance。由于C#的Generics在编译后保留,因此与Java不同,C#允许您获取给定类型参数的Type实例,从而调用CreateInstance或任何其他构造函数。

对于无参数构造函数,使用通用约束会非常容易:

void <T> T createT() where T : new()
{
    return new T();
}

此处的关键是where T : new()

在一般情况下,使用反射,您可以使用以下内容:

void <T> T createT()
{
    var typeOfT = typeof(T);
    return (T) Activator.CreateInstance(typeOfT, new object[] { arg1, arg2 … });
}

答案 2 :(得分:5)

是的,这是可能的。您可以使用Activator.CreateInstance<T>();

来自MSDN

  

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

答案 3 :(得分:3)

在c#中,您可以使用where关键字

private class MyClass<T> where T : new()
{
        private void AMethod()
        {
            T myVariable = new T();
        }
}

答案 4 :(得分:3)

您可以通过反射在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();
    }
}

答案 5 :(得分:1)

Java中的一个不那么难看的解决方法:Javassist

答案 6 :(得分:0)

总结一下,在java中没有办法实例化泛型类型T. 在C#中,有几种方法。

我是否正确理解了这一点?