2015-11-03 63 views
1

請注意:儘管此問題專門討論了Netflix' Hystrix庫,但這絕對是一個純粹的Groovy/JVM泛型問題。任何乏味的Java/Groovy老手都應該能夠回答這個問題,不管他們對Hystrix有什麼知識/經驗。嵌套Groovy類型:內部泛型類型上的意外令牌


我想建立一個抽象基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: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。任何想法是什麼導致此編譯器錯誤?

回答

3

你不能在你的類型參數使用中間類型,你只需直接聲明的類型參數,然後使用參數Optional作爲方法參數或返回類型:

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

您還可以創建一個第二基於約束的類型參數的第一個(雖然這裏的例子是愚蠢的,你不會擴大Optional),但你需要在instanciation指定其具體類型:

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

UPDATE

HystrixCommand實際上是一個參數化類,和你想它的參數化方法(如run())返回Optional。只要正確參數化HystrixCommand在子類:

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

當然,所有返回的參數類型的方法現在將返回Optional,它保持與原申報一致。

注意:你真的想爲參數化類型使用單個字母,以避免與常量混淆,並遵循風格約定。

+0

謝謝@Frank Pavageau(+1) - 問題是通過擴展'HystrixCommand'我必須重寫幾個方法,比如['HystrixCommand#run'](https://netflix.github.io/Hystrix/javadoc /com/netflix/hystrix/HystrixCommand.html#run())。我想我的run()覆蓋返回一個'Optional ',**不只是一個'RESULT'。這裏的任何想法?這聽起來像我唯一的行動方式是或許用一個虛擬包裝器繼承'Optional',然後使用'BaseHystrixCommand >'? – smeeb

+0

例如,類'Optional OptionalWrapper extends Optional {}'? – smeeb

+0

我編輯了我的答案來解決您的其他問題。 –