我是一个 .NET 人,所以让我首先声明我对一些 Java 概念的理解——如果我错了,请纠正我。
Java 泛型支持有界通配符的概念:
class GenericClass< ? extends IInterface> { ... }
...这类似于 .NETwhere
限制:
class GenericClass<T> where T: IInterface { ... }
Java的Class
类描述了一种类型,大致相当于.NETType
类
到现在为止还挺好。但是我找不到与 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 对应物?