例如,在Java中,如果我有参数化类,是否可以执行以下操作?
public class MyClass<T>{
public void aMethod {
..
T object = new T();
..
}
..
}
在Java中,我认为这是不可能的,因为编译器不知道要调用什么构造函数。但在C#?我不懂语言而且我读过很多黑暗的东西都可以做,所以我只是想知道..
答案 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#中,有几种方法。
我是否正确理解了这一点?