2016-02-24 1 views
0

Я хотел бы ограничить совместимые типы ввода метода в коллекцию подклассов определенных классов. Тем не менее, я хотел бы только разрешить прием первого уровня для подклассов. Например, класс 'shape' имеет множество подклассов, например. «Прямоугольник», «круг», «треугольник». Теперь у «прямоугольника» есть собственный «класс» подкласса, так как я могу ограничить принятые коллекции только принятием иерархического уровня подклассов, состоящих из прямоугольника, круга и треугольника без принятия квадрата?Ограничение ограниченного шаблона в Java только на один уровень подклассов класса?

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

Я знаю, что, чтобы охватить все подклассов формы и их подклассов я хотел бы сделать следующее:

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

Однако, как бы я ограничить его только один уровень подклассы от формы? i.e (только прямоугольник, круг, треугольник)

+3

Короткий ответ: вы не можете. Длинный ответ: ты не знаешь, а ты не должен. –

+3

Если вы нуждаетесь в этом, вам нужно сделать шаг назад и спросить себя, действительно ли наследование - правильный способ моделирования вашей проблемы. Это также не относится к дженерикам, это наследование в целом. Просто потому, что в вашей исходной проблеме каждый 'A' является' B', это не обязательно означает, что класс, представляющий 'A', должен расширять класс, представляющий' B'. – biziclop

ответ

0

Если вы пытаетесь это сделать, чем вы нарушаете Liskov Substitution Principle.

Вкратце говорится, что подклассы должны всегда приниматься вместо их суперкласса. Концептуально, если квадрат является прямоугольником, то как это может быть, что он не принимается, когда прямоугольник.

Итак, все это означает, что вы, вероятно, захотите моделировать свою проблему по-другому. Вы, к сожалению, не указали, какое свойство имеет квадрат, что делает его каким-то образом не прямоугольником.

Это, как говорится, что делает квадратный подкласс прямоугольника, как правило, проблематично. См .: https://en.wikipedia.org/wiki/Circle-ellipse_problem.

Смежные вопросы