Я парень .NET, поэтому позвольте мне сначала подтвердить свое понимание нескольких понятий Java - исправьте меня, если я ошибаюсь.
Java Generics поддерживает концепцию ограниченных подстановочных знаков:
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-копию?