2016-12-17 1 views
5

Ceci est un exemple artificiel, mais plus simple à expliquer que mon code actuel:Existe-t-il un moyen d'éviter la répétition de paramètres de type génériques lorsqu'un type peut être déduit de l'autre?

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

Je voudrais éviter la répétition de T dans cette signature de type parce qu'il devient difficile à manier lorsque les paramètres eux-mêmes paramètres, pour exemple:

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

Dans cet exemple, j'ai l'impression que le premier paramètre pourrait être déduit de la seconde. Y a-t-il un truc pour faire ça?

+1

Comment sont vous utilisez les types? – Bohemian

+0

@Bohemian Je ne suis pas tout à fait sûr de ce que vous voulez dire par votre question. –

+0

Afficher le code qui utilise les types. Peut-être que vous n'avez pas besoin du type (s)! – Bohemian

Répondre

2

Une façon pourrait être d'utiliser une sous-interface plus spécifique qui aura besoin un seul paramètre de type, quelque chose comme:

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

Alors votre code serait:

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

Merci. Dans beaucoup de cas ceci fonctionnera, mais c'est assez contraignant: 'ListOwner ' est un sous-type du type que je veux, pas un alias. Je cherchais une solution similaire aux alias de type dans Rust ou Haskell, ou quelque chose comme vous pouvez obtenir avec les dépendances fonctionnelles de Haskell, que Rust peut approximer avec les types associés. Il semble que [Scala a un certain support pour les dépendances fonctionnelles] (https://milessabin.com/blog/2011/07/16/fundeps-in-scala/), donc je vais peut-être essayer cela à la place. –