Вложенные универсальные шаблоны: неожиданный токен для внутреннего универсального типа
Обратите внимание: несмотря на то, что этот вопрос специально адресован библиотеке Hyfrix от Netflix, он, безусловно, является чисто общим для Groovy/JVM вопросом. Любой измотанный в боях ветеран Java/Groovy должен иметь возможность ответить на этот вопрос, независимо от его знаний / опыта работы с Hystrix.
Я хочу построить абстрактную базу HystrixCommand
вернуть гуаву Optionals
как их общий RESULT
тип:
import com.google.common.base.Optional
import com.netflix.hystrix.HystrixCommand
abstract class BaseHystrixCommand<Optional<RESULT>> extends HystrixCommand {
// My code here...
}
Однако этот код выдает следующую ошибку компилятора:
Groovy: неожиданный токен: <@ строка 23, столбец 42.
Строка 23, столбец 42 - это внутренняя угловая скобка для RESULT
:
...BaseHystrixCommand<Optional<RESULT...
^ right here
Используя Java 8, Groovy 2.4.3, Hystrix 1.4.18 и Guava 18.0 здесь. Любые идеи, что вызывает эту ошибку компилятора?
1 ответ
Вы не можете использовать промежуточные типы в параметрах вашего типа, вы просто объявляете параметры типа напрямую, а затем используете параметризованные Optional
как параметр метода или тип возвращаемого значения:
abstract class BaseHystrixCommand<T> extends HystrixCommand {
Optional<T> someMethod();
}
Вы также можете создать второй параметр связанного типа, основанный на первом (хотя пример здесь глупый, вы не будете расширять Optional
), но вам нужно будет указать его конкретный тип при создании:
abstract class BaseHystrixCommand<T, U extends Optional<T>> extends HystrixCommand {
U someMethod();
}
ОБНОВИТЬ
HystrixCommand
на самом деле является параметризованным классом, и вы хотите сделать его параметризованные методы (такие как run()
) вернуть Optional
, Просто параметризовать HystrixCommand
правильно в подклассе:
abstract class BaseHystrixCommand<T> extends HystrixCommand<Optional<T>> {
// ...
}
Конечно, все методы, возвращающие параметризованный тип, теперь будут возвращать Optional
, он остается в соответствии с первоначальной декларацией.
Примечание: вы действительно хотите использовать отдельные буквы для параметризованных типов, чтобы избежать путаницы с константами и следовать правилам стиля.