私は .NET 派なので、最初に Java のいくつかの概念について理解していることを主張させてください。間違っていたら訂正してください。
Java Generics は、限定されたワイルドカードの概念をサポートしています。
class GenericClass< ? extends IInterface> { ... }
...これは .NET のwhere
制限に似ています。
class GenericClass<T> where T: IInterface { ... }
Java のClass
クラスは型を記述し、 .NETクラスとほぼ同等ですType
ここまでは順調ですね。Class<T>
しかし、T が限定されたワイルドカードである場合に、一般的に型指定された Java に十分に近い等価物を見つけることができません。これは基本的に、 が表す型に制限を課し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 の対応物を改善する方法はありますか?