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类型 
总结就两句话。。 当时理解起来,绕了很多圈子。 
不知我理解得对不对,还望李老师指点一二,感激不尽。



原创粉丝点击