2

请注意:尽管这个问题专门针对Netflix 的 Hystrix库,但这绝对是一个纯粹的 Groovy/JVM 泛型问题。任何厌倦了 Java/Groovy 的老手都应该能够回答这个问题,无论他们对 Hystrix 的知识/经验如何。


我想构建一个抽象基础HystrixCommand以将 GuavaOptionals作为其通用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。任何想法是什么导致了这个编译器错误?

4

1 回答 1

3

您不能在类型参数中使用中间类型,您只需直接声明类型参数,然后使用参数化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,它与原始声明保持一致。

旁注:您确实希望对参数化类型使用单个字母,以避免与常量混淆并遵循样式约定。

于 2015-11-03T15:23:33.933 回答