将Java中的有界通配符类型限制为只有一个类的子类?

时间:2016-02-24 20:41:55

标签: java generics wildcard bounded-wildcard

我想将方法​​输入的兼容类型限制为某个类子类的集合。但是,我只想允许接受子类的第一级。例如,班级形状'有各种各样的子类,例如。 '矩形''圆''三角形&#39 ;.现在'矩形'拥有它自己的子类' square'那么如何限制接受的集合只接受包含矩形,圆形和三角形的子类的层次级别而不接受正方形?

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

我知道要包含形状及其子类的所有子类,我将执行以下操作:

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

但是,我如何将其限制为仅从形状下降到一个级别的子类?即(矩形,圆形,三角形)

1 个答案:

答案 0 :(得分:0)

如果您尝试这样做,那么您违反了Liskov Substitution Principle

简而言之,它指出应始终接受子类来代替它们的超类。从概念上讲,如果一个正方形是一个矩形,那么它怎么可能是一个矩形所不被接受的。

所以,这只是意味着您可能希望以不同的方式对问题进行建模。遗憾的是,你没有提到 square 具有什么属性,这使得它不是矩形

话虽如此,将 square 作为 rectangle 的子类通常会有问题。请参阅:https://en.wikipedia.org/wiki/Circle-ellipse_problem