У меня есть класс под названием 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?