I have written generics code many times, without too much trouble. However, I just wrote some code that go wrong at runtime, and it is fine. But it should, in my understanding, also issue a compiler error, but it does not. Can anyone explain why?
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
public class TestGenerics {
    interface I{}
    class A implements I{}
    private <Z extends I> Z get(){
        return (Z) new A();
    }
    @Test
    public void test() {
        A a1 = get();
        assertNotNull(a1);
        String b = get(); // this compiles. Why?
    }
}
Edit: don't focus on the cast to Z. I want to understand why the signature of the method say that It Is going to return something that implements I and i can assign It to a String without casting, as if String Is instanceof I which Is not