java - 嵌套 Groovy 泛型 : unexpected token on inner generic type

标签 java generics groovy guava hystrix

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


我想建立一个抽象基地HystrixCommand返回 Guava Optionals作为他们的通用 RESULT 类型:

import com.google.common.base.Optional
import com.netflix.hystrix.HystrixCommand

abstract class BaseHystrixCommand<Optional<RESULT>> extends HystrixCommand {
    // My code here...
}

但是此代码会产生以下编译器错误:

Groovy:unexpected token: < @ line 23, column 42.

第 23 行第 42 列是 RESULT 的内部左尖括号:

...BaseHystrixCommand<Optional<RESULT...
                              ^ right here

此处使用 Java 8、Groovy 2.4.3、Hystrix 1.4.18 和 Guava 18.0。你知道是什么导致了这个编译器错误吗?

最佳答案

您不能在类型参数中使用中间类型,只需直接声明类型参数,然后使用参数化的 Optional 作为方法参数或返回类型:

abstract class BaseHystrixCommand<T> extends HystrixCommand {
    Optional<T> someMethod();
}

您还可以基于第一个创建第二个绑定(bind)类型参数(尽管这里的示例很愚蠢,您不会扩展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,它与原始声明保持一致。

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

关于java - 嵌套 Groovy 泛型 : unexpected token on inner generic type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33502425/

相关文章:

java - 当创建同一对象的多个实例时,Java 是否会复制方法实现?

java - Android - 进度条不更新

java - 带扩展的通配符

haskell - 如何从类型表示中获取 Data.Data.Constr 等?

java - 你能用 Guava 复制 Clojure 的(分区)或 Scala 的 sliding() 函数吗?

java - 如何在浏览器中执行 "back"和 "forward"时强制用户输入用户名和密码?

typescript :将 typeof 与泛型结合使用

Gradle 配置集成

grails - Grails-全局通用的制作方法和元类编程

spring - 如何在 Grails 电子邮件服务中获取自定义 "from address"