我有一个名为Point
的类,它有一个返回Point
数组的neighbors()
方法:
public class Point {
public Point[] neighbors() { /* implementation not shown */ }
}
我有一个Point
的子类,叫做SpecialPoint
,它重写neighbors()
返回一个SpecialPoint
数组而不是Point
数组,我认为这叫做协变返回类型。
public class SpecialPoint extends Point {
public SpecialPoint[] neighbors() { /* implementation not shown */ }
}
在一个单独的类中,我希望通过泛型使用Point
和SpecialPoint
public <P extends Point> P doStuff(P point) {
P[] neighbors = point.neighbors();
// more stuff here including return
}
这不会编译,因为编译器只能保证P
是Point
的某个子类,但不能保证Point
的每个子类都会重写neighbors()
以返回自身的数组,就像我对SpecialPoint
所做的那样,所以Java只知道P#neighbors()
返回Point[]
,而不是P[]
。
我如何保证每个子类都用协变返回类型覆盖neighbors()
,这样我就可以在泛型中使用它?
https://stackoverflow.com/questions/29676945
复制相似问题