I wonder if this comment on page 572 could be improved:
"We put a new Cat into a Dog array. The compiler allowed it because it knows that you might have passed a Cat array or Animal array to the method, so to the compiler it was possible that this was OK"
The example on the page before (pg. 571) mentions how the compiler just won't let you take the risk of passing a Dog ArrayList to a method that takes an Animal ArrayList argument because someone might try to, say, add a new Cat object to that ArrayList.
The comment on 572 seems to justify the compiler's permission (the operation may work sometimes) for the exact same reason it's denied in the ArrayList scenario.
I understand that main point is that the difference is because "Array types are checked again at runtime, but collection type checks happen only when you compile" but maybe a postscript to the comment could be "It's only because of that second check at runtime that the compiler can afford to be uncharacteristically relaxed and open a beer at the party."
It's a small point, but I like the book and think it should be even better, if possible.