Java 泛型详解
首先我们要知道为什么会有泛型这种东西,按照我的理解就是:
有了泛型,可以使得一个类操作广泛的其他类
没有泛型之前,我们其实可以使用Object来进行广泛的代表,但这毕竟不是一个好方法,比如如下代码
Object o = new String();
String s = (String) o;
看到没有,就算是使用了Object,但从父类到子类时是要进行类型转换的。稍不小心就有可能发生类型转换异常,就像下面的这种代码
Object o = new Integer(1);
String s = (String) o;
这样的代码再编译的时候是不会报错的,只有在运行的时候才会爆出一个类型转换异常的错误
1.定义带类型参数的类
定义带类型参数的类很简单,形式如下
public class Fanxing<T> {
}
这是最简单的,只有一个类型参数,如果你想多定义几个类型参数就要像这样写
public class Fanxing<T,S,K,L> {
}
想要多少就要多少,只不过是多加几个逗号和字母而已
那么如果我想限定这些类型参数之间的关系怎么写呢?比如我要S是T得子类,那就要像下面这样写了
public class Fanxing<T,S extends T,K,L> {
}
类型参数之间限定关系只能使用extends
2.定义带类型参数的方法
定义带类型参数的方法也很简单,就像下面这样
public <T> void set(T t){
}
public <T,S extends T> void set1(T t,S s){
}
public <T,S extends T> T get(T t,S s){
}
public <T,S extends T> S get1(T t,S s){
}
上面给出了几种通用的定义带类型参数的方法的写法
3.
1.这个实例的类必须是Fanxing
2.这个实例所操作的类必须是Parent,也就是尖括号中的那个类
这样一来,对于第二个方法就好说了
test2(f1);//不可行
test2(f2);//可行
接下来看方法三
test3(f1);//可行
test3(f2);//可行
那么这里为什么就两个都可行了呢?
看我上面总结出的两点规则是否都满足
1.f1,f2都是Fanxing这个类的实例,这是满足的
2.f1,f2操作的类满足尖括号中的类吗?答案是满足,因为尖括号中是
? extends Parent
这句的意思就是:这个实例也不确定操作的类是哪一个,但是这个类必须继承自Parent,虽然没有自己继承自己一说,但是显然Child和Parent都是满足尖括号中的关系的。
如果上面那句话理解了的话,那么方法4的结果就好说了
test4(f1);//可行
test4(f2);//可行
因为在方法4中要求实例操作的那个类必须是Child的父类,所以Child和Parent都是满足的
方法5对f1和f2也都是可行的