class OneGener<T> {
T name;
public OneGener() {
this.name = name;
}
public OneGener(T name) {
this.name = name;
}
public OneGener<T> Test(T name) {
//调用Test方法,传入任意类型的对象,那么T就为对应类型,但不会影响返回值类型
return new OneGener<T>(name); //T为Object
//下面的方法并没有往<T>参数里传入具体类型,所以该返回值为Object类型
}
}
疑问1:public OneGener ss(){} 返回值类型为 OneGener 编译不报错。
程序执行 return o.Test(1) -> return new OneGener( T 1) 虽然参数是数字1,但我没有传实际类型。所以这里返回的是ObjGener 所以没有用到泛型的实际类型String。李老师 我这里理解得对不对?
那么如果我想用实际的泛型类型怎么办呢?
public OneGener sss() {
OneGener o = new OneGener();
//在创建对象时,明确指明想持有什么类型的对象,将其置于尖括号中,然后你就只能在OneGener中存入该类型
//这时如果类声明还是那么就得到编译错误提示
return o.Test(1);
}
static泛型
public static <T> OneGener<T> Test(T name) {
return new OneGener<T>(name);
}
public OneGener<Integer> sss() {
//<Integer>不和返回值相同就报错
return OneGener.Test(1);
//这里返回的就是Integer类型了
}
static方法是在初始化的时候开始编译的,T是编译器动态决定的,所以这时的 T 并不知道它是什么东西。所以和类上的泛型参数毫无关系。但不是说你不能用static泛型。