Идея состоит в том, что любая функция, которая принимает PositivePoint, полагается на тот факт, что значения точки являются положительными. Если вы перешли в точку, значения которой не являются положительными, предположение ложно, и функция потерпит неудачу.
Однако функция, принимающая точку, не делает никаких предположений о ее положительной точке, поэтому, если вы перейдете в PositivePoint, все будет в порядке.
Обратите внимание, что это верно только для неизменного класса Point. Если бы вы могли изменить значение точки, PositivePoint и Point вообще не могли бы иметь отношения подкласса, потому что операция p.x = -1
не будет выполнена для PositivePoints.
Редактировать: уточнять:
Допустим, у нас есть 2-мерный массив, который автоматически увеличивается при необходимости (то есть, при передаче двух положительных индексов вы никогда не получите ошибку индекса за пределами границ). Теперь у нас есть функция, которая принимает PositiveInteger p, а затем обращается к 2d-массиву по индексу x, y. Это не может не сработать, потому что x и y гарантированно будут положительными, а 2d-массив может быть проиндексирован любой парой положительных индексов. Однако, если Point является подтипом PositivePoint, p может иметь отрицательные значения, даже если он объявлен положительным. Это будет означать, что его уже нельзя использовать для индексации массива.
Однако функция, принимающая точку, не знает, являются ли значения точки отрицательными или положительными - она уже должна учитывать вероятность того, что они положительные. Поэтому передача в PositiveInteger не может ничего сломать.