public String showType(){
return "实际参数的类型是="+object.getClass().getName();
}
}
![这里写图片描述](https://img-blog.csdn.net/20160318175238144)
> 在解析的时候,需要进行类型的强制转换。
下面是使用泛型的例子:
/**
- 使用泛型定义的类型 on 2016/3/18.
*/
public class GenTDemo {
private T object;
public GenTDemo(T ob){
this.object = ob;
}
public T getObject() {
return object;
}
public void setObject(T object) {
this.object = object;
}
public String showType(){
return "泛型定义的类的实际参数的类型是="+object.getClass().getName();
}
}
![这里写图片描述](https://img-blog.csdn.net/20160318175632599)
> 使用泛型的时候,直接获取的是相应的类型。不许强制转换。
> 注意:基本类型无法作为 T 的实际参数传递的
#### 下面是对为什么能获取到对应类型的解释,为什么类没有受到类擦除机制的影响。(摘录)
第一组关键词:引用,实例化。
先看下面这个简单的例子:
Object obj=new Integer();
System.out.println(obj.getClass());
obj是引用,引用的类型是Object,实例的类型是Integer
我们知道,引用是栈保存的一个类似地址的信息,本身没有任何含义,真正能保存信息的是new Integer()所划分的内存空间。
即是说,Integer这个信息是在实例里的
第二组关键词:继承,父类,子类
Integer继承自Object
obj.getClass()调用的是Integer的getClass方法,当然Integer是没有该方法,于是一直回溯到父类Object,找到Object的getClass方法,实现是本地native方法,我们不知道内部怎么构造,但是可以肯定,它是在根据引用地址找到实例位置,确定实例类型。
综合第一组可知,在这里,实例类型是Integer
第三才是泛型。
其实在第一部里面已经说明过了。
GenTDemo并没有维护T的信息。
维护T信息的是T ob;
GenTDemo<#Integer#> iObject执行这一部的时候,ob就认为自己是个Integer类型了。当它具有了实例之后,你才能调用getClass方法
所以综合上两点才表现出了你看到的效果。
对于GenTDemo来说,一旦运行,它就不在乎T是什么类型了,但是ob需要知道自己的类型吧?这个Integer被维护在了实例里。
* **4.2 泛型的限制,可以向上限制也可以向下限制**
/**
-
泛型里面的 T extends 的含义包括了 原来的 继承和实现,是两者的结合
-
T 必须是集合的类
-
lh on 2016/3/18.
*/
public class CollectionGenFoo< T extends Collection> {
/**
-
lh on 2016/3/18.
-
其中? 通配符泛型 表示不确定的类型
-
其中k 表示内部实现comparable 的类,类似String,int 等
*/
public class Gen2Value<T,K extends Comparable<?>> {
private T t;
private K k;
public Gen2Value(T t1,K k1){
this.t = t1;
this.k = k1;
}
/**
-
lh on 2016/3/18.
-
其中? 通配符泛型 表示不确定的类型
-
其中k 表示内部实现comparable 的类,类似String,int 等,? super Double 而且必须是Double的父类
*/
public class GenSuper2Value<T,K extends Comparable<? super Double>> {
private T t;
private K k;
public GenSuper2Value(T t1, K k1){
this.t = t1;
this.k = k1;
}
> 下面截图中都有解释说明
> ![这里写图片描述](https://img-blog.csdn.net/20160318180906817)
**4.3 泛型的方法的使用**
> 使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样。
> 需要注意,一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。
/**
- lh on 2016/3/18.
*/
public class TMethoddemo {
public <T> void f(T x){
Log.d("test","测试泛型方法 TMethoddemo x="+x.getClass().getName());
}
}
![这里写图片描述](https://img-blog.csdn.net/20160318181939158)
### 最后
对于开头提出的问题,现在有点思路,还是希望有人帮助当然最好。。。。