Вложенные универсальные шаблоны: неожиданный токен для внутреннего универсального типа

Обратите внимание: несмотря на то, что этот вопрос специально адресован библиотеке 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, он остается в соответствии с первоначальной декларацией.

Примечание: вы действительно хотите использовать отдельные буквы для параметризованных типов, чтобы избежать путаницы с константами и следовать правилам стиля.

Другие вопросы по тегам