Java泛型详解

来源:互联网 发布:免费会计软件 编辑:程序博客网 时间:2024/05/21 17:03

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也都是可行的

0 0