在泛型中有个问题没搞懂

这个泛型的泛型程序中
public class WrapperFoo

{

private GenericFoo4 foo;

    public GenericFoo4<T> getFoo()  
    {  
        return foo;  
    }  

    public void setFoo(GenericFoo4<T> foo)  
    {  
        this.foo = foo;  
    }  
    public static void main(String[] args)  
    {  
        GenericFoo4<Integer> foo = new GenericFoo4<Integer>();  
        foo.setFoo(new Integer(-10));  

        WrapperFoo<Integer> wrapper = new WrapperFoo<Integer>();  
        wrapper.setFoo(foo);  

        GenericFoo4<Integer> g = wrapper.getFoo(); 为什么在这  GenericFoo4<Integer> g 可以被wrapper.getFoo();赋值有点乱- -大神帮我解答下吧谢谢。
        System.out.println(g.getFoo());  
    }  
}  
class GenericFoo4<T>  
{  
    private T foo;  

    public T getFoo()  
    {  
        return foo;  
    }  

    public void setFoo(T foo)  
    {  
        this.foo = foo;  
    }  

}  
 wrapper是WrapperFoo<Integer>类型,所以泛型参数T是Integer,
GenericFoo4<T> getFoo()  这个函数返回类型是GenericFoo4<T>,带入Integer是GenericFoo4<Integer>
所以可以