fanxing
来源:互联网 发布:淘宝哪家男鞋店好最潮 编辑:程序博客网 时间:2024/04/28 06:52
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泛型。
在这里基本和Object是一个意思。
因为这是方法泛型,所以传参调用后,参数的类型直接决定了static里T的类型
而第一个例子是类泛型,所以只能在实例化的时候传入类型,不然其他时候都为Object类型
总结就两句话。。 当时理解起来,绕了很多圈子。
不知我理解得对不对,还望李老师指点一二,感激不尽。