我是一個.NET人,所以讓我首先斷言我對幾個Java概念的理解 - 糾正我,如果我錯了。.Net等價於Java類型Class <>?
Java的泛型支持界通配符概念:
class GenericClass< ? extends IInterface> { ... }
...這是類似的.NET where
限制:
class GenericClass<T> where T: IInterface { ... }
Java的Class
類描述一個類型,大致爲等效於.NET Type
類
到目前爲止,這麼好。但是我找不到與Java通用類型Class<T>
足夠接近的等價關係,其中T是有界通配符。這基本上對Class
表示的類型施加了限制。
讓我舉個Java的例子。
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Class<? extends IExternalSort> customClass
= Class.forName("MyExternalSort")
.asSubclass(IExternalSort.class); //this checks for correctness
IExternalSort impl = customClass.newInstance(); //look ma', no casting!
我能得到.NET中最接近的是這樣的:
String custSortclassName = GetClassName(); //only known at runtime,
// e.g. it can come from a config file
Assembly assy = GetAssembly(); //unimportant
Type customClass = assy.GetType(custSortclassName);
if(!customClass.IsSubclassOf(typeof(IExternalSort))){
throw new InvalidOperationException(...);
}
IExternalSort impl = (IExternalSort)Activator.CreateInstance(customClass);
Java版本看起來比較清爽給我。 有沒有一種方法來改善.NET的對應?
這可能有點太簡單了,但是不能簡單地將new()約束添加到where限制嗎?就像'MyExternalSort:IExternalSort where T:IExternalSort,new()',然後使用'var impl = new T();'?就我個人而言,我會使用工廠模式在這種情況下創建實現相同接口的類型的實例。 –
Carsten
我不太瞭解Java泛型,但我知道它們的實現方式不同(不支持JVM),並支持.NET泛型不具備的一些功能。所以不要指望找到一切的「等價」 – jalf
@Aschratt我不明白這與我的問題有什麼關係。如果所有類型信息在編譯時已知,但此類技巧可能很有用,但類型MyExternalSort在運行時纔可知 - 它可能由我的排序庫的客戶端實現,並且僅由名稱指定。 –