Этот вопрос старый, но я думаю, что более ясное объяснение состоит в том, чтобы вызвать принцип подстановки Лискова: все, что верно в отношении суперкласса, должно быть верным для всех его подклассов. Вы должны иметь возможность делать с SubFoo все, что вы можете делать с Foo, а может и больше.
Предположим, у нас есть Calico & lt ;: Cat & lt ;: Animal, а Husky & lt ;: Dog & lt ;: Animal. Давайте посмотрим на Function[Cat, Dog]
. Какие утверждения правдивы по этому поводу? Их два:
(1) Вы можете передать любой Cat (так, любой подкласс Cat)
(2) Вы можете вызвать любой метод Dog для возвращаемого значения
Так что Function[Calico, Dog] <: Function[Cat, Dog]
имеет смысл? Нет, операторы, которые являются истинными для суперкласса, не являются истинными для подкласса, а именно, оператор (1). Вы не можете передать ни одного кота в функцию, которая берет только кошек Калико.
Но имеет ли Function[Animal, Dog] <: Function[Cat, Dog]
смысл? Да, все утверждения о суперклассе верны для подкласса. Я все еще могу передать любой Cat - фактически я могу сделать даже больше, я могу передать любой Animal - и я могу вызвать все методы Dog для возвращаемого значения.
Итак, A <: B
подразумевает Function[B, _] <: Function[A, _]
Теперь, имеет ли Function[Cat, Husky] <: Function[Cat, Dog]
смысл? Да, все утверждения о суперклассе верны для подкласса; Я все еще могу передать Cat, и я все еще могу вызывать все методы Dog для возвращаемого значения - на самом деле я могу сделать даже больше, я могу вызвать все методы Husky для возвращаемого значения.
Но имеет ли Function[Cat, Animal] <: Function[Cat, Dog]
смысл? Нет, утверждения, которые являются истинными для суперкласса, не являются истинными для подкласса, а именно утверждения (2). Я не могу вызвать все методы, доступные в Dog для возвращаемого значения, только те, которые доступны в Animal.
Таким образом, с помощью Function[Animal, Husky]
я могу делать все, что могу, с помощью Function[Cat, Dog]
: я могу передать любой Cat, и я могу вызвать все методы Dog для возвращаемого значения. И я могу сделать еще больше: я могу перейти на других животных, и я могу вызвать методы, доступные на Husky, которые не доступны на Dog. Так что имеет смысл: Function[Animal, Husky] <: Function[Cat, Dog]
. Первый параметр типа может быть заменен суперклассом, второй - подклассом.
Проблема здесь в том, что вы смешиваете наследование «таблица на класс» и GenerationType.Auto
.
Рассмотрим столбец идентичности в MsSQL. Он основан на столбцах. В стратегии «таблица на класс» вы используете одну таблицу на класс, и каждая из них имеет идентификатор.
Попробуйте:
@GeneratedValue (strategy = GenerationType.TABLE)