当前位置: 首页 > 工具软件 > Xing > 使用案例 >

fanxing

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



 类似资料:

相关阅读

相关文章

相关问答