嵌套 Groovy 泛型:内部泛型类型上的意外标记
Nested Groovy generics: unexpected token on inner generic type
请注意: 尽管这个问题专门针对 Netflix' Hystrix 库,但本质上这绝对是一个纯粹的 Groovy/JVM 泛型问题。任何厌倦战斗的 Java/Groovy 老手都应该能够回答这个问题,无论他们 knowledge/experience 是否使用 Hystrix。
我想构建一个抽象基础 HystrixCommand
to return 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
作为方法参数或 return 类型:
abstract class BaseHystrixCommand<T> extends HystrixCommand {
Optional<T> someMethod();
}
您还可以基于第一个创建第二个绑定类型参数(虽然这里的示例很愚蠢,您不会扩展 Optional
),但您需要在实例化时指定其具体类型:
abstract class BaseHystrixCommand<T, U extends Optional<T>> extends HystrixCommand {
U someMethod();
}
更新
HystrixCommand
其实是一个参数化的class,你要让它的参数化方法(比如run()
)return变成Optional
。只需在 subclass:
中正确参数化 HystrixCommand
abstract class BaseHystrixCommand<T> extends HystrixCommand<Optional<T>> {
// ...
}
当然,所有 return 参数化类型的方法现在都会 return 一个 Optional
,它与原始声明保持一致。
旁注:您确实希望对参数化类型使用单个字母,以避免与常量混淆并遵循样式约定。
请注意: 尽管这个问题专门针对 Netflix' Hystrix 库,但本质上这绝对是一个纯粹的 Groovy/JVM 泛型问题。任何厌倦战斗的 Java/Groovy 老手都应该能够回答这个问题,无论他们 knowledge/experience 是否使用 Hystrix。
我想构建一个抽象基础 HystrixCommand
to return 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
作为方法参数或 return 类型:
abstract class BaseHystrixCommand<T> extends HystrixCommand {
Optional<T> someMethod();
}
您还可以基于第一个创建第二个绑定类型参数(虽然这里的示例很愚蠢,您不会扩展 Optional
),但您需要在实例化时指定其具体类型:
abstract class BaseHystrixCommand<T, U extends Optional<T>> extends HystrixCommand {
U someMethod();
}
更新
HystrixCommand
其实是一个参数化的class,你要让它的参数化方法(比如run()
)return变成Optional
。只需在 subclass:
HystrixCommand
abstract class BaseHystrixCommand<T> extends HystrixCommand<Optional<T>> {
// ...
}
当然,所有 return 参数化类型的方法现在都会 return 一个 Optional
,它与原始声明保持一致。
旁注:您确实希望对参数化类型使用单个字母,以避免与常量混淆并遵循样式约定。