簡體   English   中英

是否可以在Java或C#中實例化通用類型的對象?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM