Eu não testei, mas provavelmente tá certo, mas fiquei na duvida em como o servidor faz pra setar o ID, já que Person não possui esse método. Ele faz um cast por conta ??
Acredito que ele utiliza Aspecto pra poder criar um metodo em tempo de execução.
Dessa forma, no momento que você informa um valor no campo ID ele automaticamente através de aspecto e annotação, sabe que para setar um valor, precisa criar um set + nome do campo, assim é criado o setId em tempo de execução e seta o valor pra ele.
Acredito que possa ser pela utilização de reflexão na hora de chamar o método, dessa forma ele deve usar o tipo da classe, e não o tipo passado pelo parametro type.
Com reflexão pode-se resolver o problema do casting.