2016-12-17 54 views
5

這是一個人爲的例子,但更簡單的比我實際的代碼來解釋:當一種類型可以從另一種類型推斷時,是否有避免重複泛型類型參數的方法?

public interface ContainerOwner<T, C extends Container<T>> { 
    // ... 
} 

我想避免這種類型的簽名T重複,因爲當參數本身具有的參數變得笨拙,爲例如:

ContainerOwner< 
    Optional<Future<Map<String, Integer>>>, 
    List<Optional<Future<Map<String, Integer>>>> 
> foo; 

在這個例子中,我覺得第一個參數可以從第二個參數推斷出來。有這樣的訣竅嗎?

+1

怎麼樣你使用的類型? – Bohemian

+0

@Bohemian我不太清楚你的問題是什麼意思。 –

+0

顯示使用這些類型的代碼。也許你不需要類型(s)! – Bohemian

回答

2

的一種方法是使用更具體的子界面,將需要只有一個類型的參數,是這樣的:

public interface ListOwner<T> extends ContainerOwner<T, List<T>> { 
} 

那麼你的代碼將是:

ListOwner<Optional<Future<Map<String, Integer>>>> foo; 
+0

謝謝。在很多情況下,這會起作用,但這是相當有限的:'ListOwner '是我想要的類型的子類型,而不是它的別名。我正在尋找類似於Rust或Haskell中的類型別名的解決方案,或者您可以使用Haskell函數依賴關係獲得的解決方案,這些依賴關係可以通過關聯類型進行估算。看來[斯卡拉對函數依賴有一些支持](https://milessabin.com/blog/2011/07/16/fundeps-in-scala/),所以我可能會試試看。 –

相關問題