Java中泛型小总结
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。
我们最常用的,也是最基本的就是泛型接口和泛型类,也就是我们平时在使用容器的时候所使用的泛型,再有就是泛型方法,使用通配符的上限和类型通配的下限等,下面会进行一定的说明;
泛型类和泛型接口:
泛型类和泛型接口允许右定义类或接口时使用类型形参,这个类型形参将在声明变量、创建对象时动态地指定一些对象的类型。
多说无益,上代码,一看就明白最后有代码。
泛型方法:
在定义接口和类时可以使用类型形参,在该类和接口的方法定义和成员定义中这些类型形参可被当成普通的类型来使用,这些上面已经说过,现在要说的是在定义类和接口时没有使用类型形参,在定义方法时仍可以自己定义类型形参,而这就是泛型方法。
使用方法看代码,见最后。
类型通配符:
前面说过类型形参了,但是,我们在使用中会遇到问题,如果将带有类型参数的对象传递给一个方法,我们应该怎么接收呢?
说到这里插入一条说明,一条极重要的说明:在使用泛型时候不能理所应当地使用类型参数的继承关系。比如:在定义为List<String> list = new ArrayList<String>();的list中加入Object对象会报出错误,即,使用list.add(new Object());时会出错,是不能正常编译的。
而这时就要使用类型通配符了,怎么使用还是看代码:
使用这种通配符是不能对这个list进行增删的,如果进行操作,将抛出异常
通配符的上下限:
在通配符的基础之上我们还可以对类型进行限制,比如将传入的list内容纳的元素类型限制到A,我们应该使用类似于
publicstatic void testS (List<? extends A> list) 的方法进行声名。
同理,在上面接口和类的类型形参中,我们也可以使用类似的类型上限对类型进行限定。
这时就有个问题了,类型通配符与泛型方法好像是一样一样的,我们怎么区分呢:
书上的话,觉得还可以。
类型上限使用<? super A>,就不在这里浪费时间了。
代码示例:
import java.util.ArrayList;
import java.util.List;
public class TestGenericity {
public static void main(String[] args) {
//使用了泛型的类的使用
TC<String> tc = new TC<String>("abc");
System.out.println(tc.getT());//abc
//使用泛型方法的示例
TM tm = new TM();
String a = tm.getSelf("123");
System.out.println(a.getClass() + ":" + a);//class java.lang.String:123
//b为基本类型
int b = tm.getSelf(123);
System.out.println(b);//123
//类型通配符使用
List<String> list1 = new ArrayList<String>();
list1.add("aaa");
list1.add("bbb");
list1.add("ccc");
List<Integer> list2 = new ArrayList<Integer>();
list2.add(111);
list2.add(222);
list2.add(333);
testS(list1);//输出,aaa\nbbb\nccc
testS(list2);//输出,111\n222\n333
}
//使用通配符的方法,可以接收容纳任何类型的的List,进行遍历输出
public static void testS (List<?> list) {
for (int i=0; i < list.size(); i++) {
System.out.println(list.get(i));
}
// 错误,不能进行操作
// list.add(new Object);
}
}
//使用了泛型的接口
interface TG<T> {
public T getT();
}
//使用了泛型的类
class TC<T> implements TG<T>{
T t;
public TC(T t) {
super();
this.t = t;
}
@Override
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
class TM {
//可以将任意伟入的类型再传出去
public <T> T getSelf(T t) {
return t;
}
}