定义:
* 定义的时候,在某个位置传入形参的暗示<Q, P, ...>,这样在整个作用域内就可以使用Q, P了。
位置:类是在类名后面,方法是在方法名前面。
* Q, P等表示的是类名,但只是“替换标志“,而不是实际的类。(所以不能new哦)
使用:
* 使用的时候必须把Q,P替换为实际的类
从这个定义和使用的特点也可以窥探出泛型在编译器和运行期的区别。
#泛型类
先看泛型class的例子:
class Box<T> {
private T data;
public Box() {
}
public Box(T data) {
this.data = data;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
}
泛型类要注意:
1) 在定义一个泛型类的时候,在 “<>”之间定义形式类型参数,例如:“class TestGen<K,V>”,其中“K” , “V”不代表值,而是表示类型。
2) 实例化泛型对象的时候,一定要在类名后面指定类型参数的值(类型),一共要有两次书写。例如:
TestGen<String,String> t=new TestGen<String,String>();
3) 泛型中<K extends Object>,extends并不代表继承,它是类型范围限制。
1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
3、泛型的类型参数可以有多个。
4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上称为“有界类型”。
5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName("java.lang.String");
#泛型方法
在方法名之前加入尖括号<Q, V>来表示泛型方法中可以使用的类名。
1 根据实参暗示类型参数
2 根据返回值暗示
3 直接传给类型参数
public class TestExternal {
public static <T> T get(String str){
return (T)str;
}
public static void main(String[] args) {
int str=TestExternal.get("");
}
}
prefer:
http://blog.csdn.net/jiafu1115/article/details/6624254
0
0
0
8
0
0
0