有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java嵌套Groovy泛型:内部泛型类型上的意外标记

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


我想构建一个抽象基^{},以返回番石榴^{}作为它们的泛型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。知道是什么导致了这个编译器错误吗


共 (1) 个答案

  1. # 1 楼答案

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

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

    您还可以基于第一个创建第二个绑定类型参数(尽管这里的示例很愚蠢,但您不会扩展^{),但您需要在实例化时指定其具体类型:

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

    更新

    ^{}实际上是一个参数化类,您希望使其参数化方法(例如run())返回Optional。只需在子类中正确地参数化HystrixCommand

    abstract class BaseHystrixCommand<T> extends HystrixCommand<Optional<T>> {
        // ...
    }
    

    当然,所有返回参数化类型的方法现在都将返回一个Optional,它与原始声明保持一致

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