2016-02-24 2 views
0

Je voudrais limiter les types compatibles de l'entrée d'une méthode à une collection de certaines sous-classes de classes. Cependant, je voudrais seulement permettre que le premier niveau des sous-classes soit accepté. Par exemple, la classe «forme» a une variété de sous-classes, par exemple. 'rectangle', 'cercle', 'triangle'. Maintenant, le 'rectangle' a sa propre sous-classe 'carré' alors comment limiter les collections acceptées pour accepter uniquement le niveau hiérarchique des sous-classes comprenant le rectangle, le cercle et le triangle sans accepter le carré?Limiter le type joker borné en Java à un seul niveau des sous-classes d'une classe?

0     shape 
       / | \ 
1  rectangle circle triangle 
      | 
2  square 

Je sais que pour englober toutes les sous-classes de forme et de leurs sous-classes que je ferais ce qui suit:

public void methodName(List<? extends shape>){ ... } 

Cependant, comment pourrais-je limiter à un seul niveau de sous-classes de la forme? i.e (seulement rectangle, cercle, triangle)

+3

Réponse courte: vous ne pouvez pas. Longue réponse: vous caaaaaaaaaaaaan't, et vous ne devriez pas. –

+3

Si vous en ressentez le besoin, vous devez prendre du recul et vous demander si l'héritage est bien la façon correcte de modéliser votre problème. Ce n'est pas spécifique aux génériques non plus, c'est l'héritage en général. Tout simplement parce que dans votre problème d'origine, tout 'A' est un' B', cela ne signifie pas nécessairement que la classe représentant 'A' devrait étendre la classe représentant' B'. – biziclop

Répondre

0

Si vous essayez de le faire, que vous violez le Liskov Substitution Principle. En bref, il indique que les sous-classes doivent toujours être acceptées à la place de leur superclasse. Conceptuellement, si un carré est un rectangle, alors comment pourrait-il être, qu'il n'est pas accepté quand un rectangle est. Donc, cela signifie simplement que vous voulez probablement modéliser votre problème d'une manière différente. Vous n'avez malheureusement pas mentionné quelle propriété le carré a fait que ce soit en quelque sorte pas un rectangle.

Cela dit, ce qui carré une sous-classe de rectangle est généralement problématique. Voir: https://en.wikipedia.org/wiki/Circle-ellipse_problem.