[英]Is it possible to instantiate an object of generic type in Java or C#?
例如,在Java中,如果我有一個參數化的類,是否可以執行以下操作?
public class MyClass<T>{
public void aMethod {
..
T object = new T();
..
}
..
}
在Java中,我認為這是不可能的,因為編譯器不知道要調用哪個構造函數。 但是在C#中? 我不懂這種語言,而且我讀過很多可以做的黑暗事情,所以我只是想知道。
如果要在T類型上設置約束以具有無參數構造函數,則在C#中這是可能的。
public class MyClass<T> where T:new(){
public void aMethod {
..
T object = new T();
..
}
..
}
看這里 。
就像Donut所說的那樣,C#允許您在運行時使用Activator.CreateInstance
實例化任意類型,該方法的工作方式類似於Java中的Class<?>.newInstance
。 由於C#的泛型是在編譯后保留的,因此與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 … });
}
是的,有可能。 您可以使用Activator.CreateInstance<T>();
從MSDN :
Activator.CreateInstance(T)方法
使用無參數構造函數創建由指定的泛型類型參數指定的類型的實例。
在C#中,您可以使用where關鍵字
private class MyClass<T> where T : new()
{
private void AMethod()
{
T myVariable = new T();
}
}
您可以通過反射在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();
}
}
Java中不太丑陋的變通方法之一: Javassist 。
總而言之,在Java中沒有實例化泛型T的方法。在C#中,有幾種方法。
我理解正確嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.