У меня есть класс под названием Point
, с методом neighbors()
, который возвращает массив Point
s:
public class Point {
public Point[] neighbors() { /* implementation not shown */ }
}
У меня есть подкласс Point
, называемый SpecialPoint
, который переопределяет neighbors()
, чтобы вернуть массив SpecialPoint
вместо Point
s. Я думаю, что это называется ковариантными типами возврата.
public class SpecialPoint extends Point {
public SpecialPoint[] neighbors() { /* implementation not shown */ }
}
В отдельном классе я хочу использовать Point
и SpecialPoint
с generics
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()
с помощью ковариантного типа возврата, чтобы я мог использовать его с generics?