- 最早接触泛型应该是在Java各种容器上面,这样写的好处是避免取值时类型转换出错的可能性,而且指定泛型后get也不需要手动强转。
List<Integer> list = new ArrayList<Integer>();
- 类或接口上泛型
在继承或实现类或接口时,指定泛型的类型,重载的方法会替换相应的参数类型,泛型不一定是T,其他字母也可以,不过约定俗成:
? 表示不确定的java类型。
T 表示java类型。
K, V 分别代表java键值中的Key Value。
E 代表Element。
public interface Test<T> {
T aaa(T t);
}
public class Demo implements Test<Integer> {
@Override
public Integer aaa(Integer t) {
// TODO Auto-generated method stub
return null;
}
}
3.1方法的泛型和类的泛型没有必然的联系,也就是即使不是泛型类,也可以声明泛型方法
<E>是指该方法为泛型的方法(这里用的是E,为了下面泛型类区别),和返回值没有关系,实现类Demo的方法aaa的入参由调用者决定,但是返回值是int
public interface Test {
<E> int aaa(E e);
}
public class Demo implements Test {
@Override
public <E> int aaa(E e) {
return 0;
}
}
3.2 那么当泛型类和泛型方法一起出现的时候,泛型T被实现类指定的泛型类型所替换,而参数e是由调用者决定的,当然如果想要返回类型由参数决定,也可以将Integer更改为E
public interface Test<T> {
<E> T aaa(E e, T t);
}
public class Demo implements Test<Integer> {
@Override
public <E> Integer aaa(E e, Integer t) {
return null;
}
}