Я не уверен, возможно ли это или нет, но я хочу выполнить следующее:
public static <A,B extends SomeClass & A> B makeB(A thing) {...}
По существу, используя процесс, основанный на отражении/генерации, я хочу предоставить вещь типа B, где B имеет класс SomeClass
и реализует интерфейс A, а A предоставляется пользователем через Generics.
Я не спрашиваю о механизме генерации B - у меня есть это под контролем. Я ищу способ ограничить аргумент основного типа <A>
интерфейсами, а не классами, поэтому я могу использовать синтаксис B extends SomeClass & A
для безопасности безопасного типа.
Возможно ли это? Кто-нибудь знает об альтернативном подходе к этой проблеме?
Редактирование: я думаю, что я не проявил себя очень четко, поскольку это, кажется, вызывает замешательство в комментариях:
B
предназначен для подстановки подстановочного знака, так что клиент может получить один объект, который является как SomeClass
, так и A
, без необходимости делать кастинг на основе доверия. Клиент не будет иметь доступ к имени фактического класса, который реализует SomeClass
и A
, поскольку он генерируется во время компиляции, следовательно, это проблема безопасности типов.