Если я хорошо понимаю, вы хотели бы иметь возможность генерировать новый класс / тип посредством преобразования существующего типа. Что-то вроде
class Synchronized<T> {
Object invocation( Object ... args ) {
synchronize( this ) {
return original.invocation( args );
}
}
}
...
Foo f;
Synchronized<Foo> f2;
f.bar();
f2.bar(); // would be valid for the type-system
, где invocation
и original
будут ключевыми словами для этой новой абстракции.
Новый тип можно рассматривать как прокси / оболочка / адаптер вокруг исходного типа. Является ли новый тип по-прежнему подтипом оригинала или нет - это другой вопрос. Насколько абстракция будет поддерживать изменение типа возвращаемого значения, это также другой вопрос.
Хотя инструментарий байт-кода, AOP или пользовательский загрузчик классов могут достичь этой цели, я бы сказал, что по духу наиболее близким совпадением является динамический прокси. Код динамического прокси выглядит действительно ужасно похожим на то, что я написал выше. Здесь , здесь и здесь - ситуации, которые я решил с помощью динамических прокси. Конечно, динамические прокси не являются статичными, но, как следует из названия, динамические.
Боюсь, что общая проблема, которую вы описываете - как создавать варианты существующих типов - слишком широка. Предложено расширение системы типов для конкретных ситуаций, например, как создать адаптер от интерфейса X к Y, чтобы вся конкретная реализация X также могла рассматриваться как реализация Y.
Может быть, посмотрите на эти документы (я еще не прочитал их все, но планирую):
В последнем реферате написано:
Мы обсуждаем точные преимущества и
Затраты на наше расширение с точки зрения
критерии введены и иллюстрируют
полезность единообразно доступна
прокси путем реализации метода будущего
вызовы как безопасно, так и
прозрачно.
, который был одним из ваших вопросов.
Крутой вопрос, кстати, я хочу, чтобы общее решение вашей проблемы существовало. Я не претендую на звание эксперта в этой области, так что, возможно, он и есть, но я не в курсе.