override getHeader() and let it return QueryHeader like:

```java
@Override
public QueryHeader getHeader() {
    return (QueryHeader) super.getHeader();
}
```
But what happens if a user set another Header here from external. Maybe it would be even better to pass a type parameter to Message to make the contract more explicit. Something like:

```java
abstract class Message<H extends Header> {
    public Message setHeader(H header) {
        ....
    }

    public H getHeader() {
        ...
     }
....

```